JTextArea keeps scrolling the main panel to the top - java

I have defined a JTextArea as follows:
JTextArea textArea = new JTextArea();
textArea.setText("Some text");
textArea.setEditable(true);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.getVerticalScrollBar().setAutoscrolls(false);
Now this component is one of a number of components which has been added to the main JPanel which is defined as follows:
JPanel panel = new JPanel();
panel.setName("Some name");
JScrollPane scrollPane = new JScrollPane();
scrollPane.setName("Some name");
scrollPane.getViewport().add(panel);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.getVerticalScrollBar().setAutoscrolls(false);
Now the JTextArea component appears near the bottom of the main panel and is partly hidden so you have to scroll down in order to see it all. But the problem I'm getting is that when I click on it, the main panel automatically scrolls back to the top again, hiding most of my JTextArea component again. So after clicking on it, the user has to then scroll down again in order to type something in.
But I can't work out why it's doing this. Is there a problem with using a JTextArea? If I use a JTextField then the problem doesn't occur.
Any help would be greatly appreciated!!

I think, replacing scrollPane.getViewport().add(panel) by scrollPane.getViewport().setView(panel) will solve the issue.

Related

How do I resize the text inside my JScrollpane - JAVA

I'm currently learning more about Java. I'm working on creating a GUI which is able to 'translate' amino-acid characters into their 3-letter codes.
I've got everything working as intended, but I'm still struggling to understand how I can resize the text inside my JScrollpane to not exceed the width. (Example in picture)
Do I just need to change some settings or maybe add '\n's to fit the JTextArea? Here's the code:
Thanks in advance!
private void createGUI() {
Container window = this.getContentPane();
window.setLayout(new FlowLayout());
panel = new JPanel();
inputField = new JTextField();
startButton = new JButton("Convert to 3-letter code");
display = new JTextPane();
scroll = new JScrollPane(display);
//CUSTOMIZE GUI OBJECTS
inputField.setPreferredSize(new Dimension(200, 20));
display.setPreferredSize(new Dimension(400, 300));
startButton.addActionListener(this);
//SETTING UP TEXTAREA
display.setEditable(false);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.setLayout(new BorderLayout());
panel.add(scroll, BorderLayout.CENTER);
//
window.add(inputField);
window.add(startButton);
window.add(panel);
}
Better use a JTextArea instead of a JScrollPane since the best that the JScrollPane can do is to dynamically resize (Dynamically Resize a JScrollPane?)
I changed JTextPane display to a JTextArea object and changed 'display.setLineWrap(true);'
This fixed the issue I was having with JTextPane.
To answer the question in the title: How do I resize the text inside my JScrollpane
Inside your scrollpane you have some JComponent. Either that JComponent is fully visible since it is smaller or equal to the JScrollpane's viewport. Or it is bigger, in which case the JScrollpane will start displaying scrollbars and the relevant part.
To resize the text you will just have to tell the JComponent inside the JScrollpane to display the text differently. Depending on the JComponent you use this method may vary. Here some examples:
In a JLabel and most other components, increase the font size (How to change the size of the font of a JLabel to take the maximum size)
In a JLabel, switch to a multiline label (Multiline text in JLabel)
In a JTextArea, turn on word wrapping and line wrapping
In a JEditorPane you can even use markup inside the document to use different font sizes at the same time

How can I get the JTextArea to appear above the JTextField?

When I add both of them to SOUTH using BorderLayout, only the JTextArea appears. I'm using the text field as an input which is then displayed in the text area as an output above it with some other text.
It works if I set the text area to NORTH but it doesn't look great.
JPanel cmdPanel = new JPanel(new BorderLayout());
field = new JTextField(20);
cmdPanel.add(field, BorderLayout.SOUTH);
JTextArea output=new JTextArea();
output.setEditable(false);
output.setLineWrap(true);
cmdPanel.add(output, BorderLayout.SOUTH);
This image shows how it looks now with the TextArea set to NORTH.
I'm just trying to have it appear over the TextField and move up
the screen as outputs are added.
You have not provided a minimal, reproducible example but from the screen capture of your running app, it looks like you are explicitly setting the size of the JFrame. Rather than doing that, you should call method pack. Note that you should call that method after you have added both your JTextField and JTextArea to the cmdPanel and also after you have added cmdPanel to the JFrame. Also you should call method setVisible on the JFrame after calling method pack().
You should also make sure that the JTextArea has a preferred size before adding it to cmdPanel. One way to do this is by calling the constructor that takes the number of rows and columns parameters.
Maybe also wrap the JTextArea in a JScrollPane and make that the "center" component of cmdPanel?
JPanel cmdPanel = new JPanel(new BorderLayout());
field = new JTextField(20);
cmdPanel.add(field, BorderLayout.SOUTH);
JTextArea output=new JTextArea(10, 20);
output.setEditable(false);
output.setLineWrap(true);
JScrollPane scrollPane = new JScrollPane(output);
cmdPanel.add(scrollPane, BorderLayout.CENTER);
It is not possible to add two components in the same position (i.e BorderLayout.PAGE_END). To add more components in the same position, you should create a JPanel, add the components on it and then add the JPanel to the desirable position (i.e BorderLayout.PAGE_END).

Scrollable JPanel without scrollBar

I have a problem with scroling JPanel,
I have a lot of labels and fields which are generated dynamicly, but my frame can't show it all.
My code:
JPanel showPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane(showPanel);
add(scrollPane);
scrollPane.setBounds(0, 0, 400, 400);
scrollPane.setVisible(true);
scrollPane.add(Jbuttons);
And Im adding a lot of these buttons but my scrollPane won't show it.
I don't have any scrollBar, with text area I didn't have any problems.
Do you have any idea?
scrollPane.setBounds(0, 0, 400, 400); looks like you're using a null layout, don't this
scrollPane.add(Jbuttons); isn't how you should be adding content to the scroll pane, instead, add it to the showPanel which is already inside the JScrollPane. JScrollPane contains a single component, the JViewport, you can not "add" components to the JScrollPane, you must set the JViewports view to what you want shown and the manipulate this view
Take a look at How to Use Scroll Panes for more details

JScrollPane not Scrolling when text overflows

I made a JScrollPane and put a JTextArea in it. Then I added the ScrollPane to the frame. That works fine. However, When text overflows off the JTextArea, the ScrollPane will not scroll at all. Please help. Ive included a picture (The picture shows that there is text off the pane, but I cant see it, so im trying to scroll down, but its now allowing me to).
JTextArea console = new JTextArea(35, 70);
JScrollPane sp = new JScrollPane(console, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

JAVA JTAB multiple compoments

I'm begging with JAVA Swing. But when I use my JPanel can I only add one JTextPane. How can I do so I can add multiple.
Here's is what I do
JPanel panel = new JPanel();
JTP = new JTextPane();
JTP.setBackground(Color.black);
JTP.setForeground(Color.WHITE);
Lines = new JTextPane();
new BorderLayout();
panel.add(JTP, BorderLayout.WEST);
new BorderLayout();
panel.add(Lines, BorderLayout.EAST);
And there's is no errors. I know i not have giving you all the code but it's work.
JPanel panel = new JPanel();
This create a JPanel which uses a FlowLayout by default.
new BorderLayout();
This statement does nothing because you don't have a reference to the BorderLayout, to you can't use it as a layout manager on any panel.
But there is no need to use a BorderLayout for you panel, since a FlowLayout can display multiple components at one time. The problem is that the text pane needs a "preferred size" before it can be using with a layout manager.
For something simple why don't you just start with a JTextArea since it is easer to use. You can create the text area with code like:
JTextArea textArea = new JTextArea(5, 20);
and it will create a text area with a preferred size to display 5 lines of text with about 20 characters on each line.
Then you create two text areas and add them to your panel.
Of course any time you use a text area you should probably add it to a JScrollPane:
JScrollPane scrollPane = new JScrollPane( textArea );
panel.add( scrollPane );
and then add the scrollPane to the panel.
From the looks of it, you are only seeing one TextField because you aren't properly using BorderLayout.
EDIT: You said you want to change background colors, you can do that to a JTextField and a JTextArea. Check the docs! It's one line of code.
You are supposed to explicitly set the layout of the JPanel to BorderLayout like this :
JPanel panel = new JPanel(new BorderLayout());
OR
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
Even simpler, you don't need to use BorderLayout.
JPanel, by default, is assigned a FlowLayout which is capable of neatly handling more than one JComponent. Try using a JTextField or JTextArea instead of a JTextPane.
If you need to use a JTextPane because of a certain layout goal, then try the code examples I listed above.
Good luck. Don't be afraid to refer to the official Oracle docs/tutorials for Swing Layouts
http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Categories

Resources