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

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).

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

Adding a Text Area to FlowLayout Panel Java Swing

I am trying to add a text area to a Panel that has flow layout, but its not showing on my GUI...any ideas pls?
private void makeTypes() {
westPanel.setVisible(false);
centerPanel.setVisible(false);
northPanel.setVisible(false);
contentPane.add(westPanel, BorderLayout.WEST);
contentPane.add(centerPanel, BorderLayout.CENTER);
contentPane.add(northPanel, BorderLayout.NORTH);
// set panel layout and add components
centerPanel.setLayout(new FlowLayout());
northPanel.setLayout(new GridLayout(4, 1));
/**
* Adding East Panel
*/
eastPanel.setLayout(new GridLayout(4,1));
/**
* Adding text area to Centre Panel
*/
a1=new JTextArea();
centerPanel.add(a1);
a1.setVisible(true);
}
centerPanel is invisible:
centerPanel.setVisible(false);
And so nothing added to it will show.
I see that you call setVisible(true) on the JTextArea, but this will have no effect if it is being added to an invisible container since it too will be invisible. Other suggestions: Give your JTextArea decent row and column property values, something that could be done via its constructor that takes two ints (for row and column). And wrap the JTextArea within a JScrollPane and add that to the GUI. If this code is called during program run and not at startup, then call revalidate() and repaint() on the container after adding and removing components.
For more and better help, consider creating and posting a valid SSCCE.

How to make Components align to the TOP in JPanel with BoxLayout?

I'm developing a game called GalaxyWar, and I am trying to make a map selection menu. I found a problem that when I am using a BoxLayout with BoxLayout.Y_AXIS on a JPanel with setAlignmentX(CENTER_ALIGNMENT), the subcomponents (JPanel's) with assigned size, take up the entire height of the panel (all together), instead of the assigned height!
Here is my code:
scrollPane = new JScrollPane();
scrollPane.setBounds(160, 11, 452, 307);
add(scrollPane);
mapContainer = new JPanel();
mapContainer.setAlignmentX(CENTER_ALIGNMENT);
mapContainer.setAlignmentY(JPanel.TOP_ALIGNMENT);
mapContainer.setLayout(new BoxLayout(mapContainer, BoxLayout.Y_AXIS));
scrollPane.setViewportView(mapContainer);
JPanel demoPanel = new JPanel();
demoPanel.setLayout(null);
demoPanel.setBackground(Color.YELLOW);
demoPanel.setSize(50, 100);
mapContainer.add(demoPanel);
I've researched on this for long, but couldn't find any solutions so far.
try to check out
setPreferredSize()
setMaximumSize()
setMinimumSize()
set all 3 to the same value.
If it still doesn't work, you can try to put the panel, of which you are trying to set the size to fixed, inside another panel.

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

JTextArea keeps scrolling the main panel to the top

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.

Categories

Resources