I'm trying to learn about GridBagLayout and I've gotten my TextArea components to behave just the way I want except for when the window is re-sized vertically.
When the window is re-sized to be shorter the bottom TextArea snaps to a larger size instead of keeping its current size and shrinking based on weighty when it runs out of room.
I feel like it's something simple like changing the fill or something but I can't figure it out..
Code:
public class Window {
Frame frame;
Panel panel;
TextArea top;
TextArea bottom;
GridBagConstraints topC, bottomC;
Window(){
createWindow();
}
public static void main(String[] args){
new Window();
}
private void createWindow(){
//create panel for text areas
panel = new Panel(new GridBagLayout());
//create top text area
top = new TextArea();
top.setPreferredSize(new Dimension(500,500));
//create bottom text area
bottom = new TextArea();
bottom.setPreferredSize(new Dimension(500,75));
//set constraints for top text area
topC = new GridBagConstraints();
topC.anchor = GridBagConstraints.NORTH;
topC.fill = GridBagConstraints.BOTH;
topC.gridheight = GridBagConstraints.RELATIVE;
topC.gridwidth = GridBagConstraints.REMAINDER;
topC.gridx = 0;
topC.gridy = 0;
topC.insets = new Insets(2,2,2,2);
topC.weightx = 1.0;
topC.weighty = 1.0;
//set constraints for bottom text area
bottomC = new GridBagConstraints();
bottomC.anchor = GridBagConstraints.SOUTH;
bottomC.fill = GridBagConstraints.BOTH;
bottomC.gridheight = GridBagConstraints.REMAINDER;
bottomC.gridwidth = GridBagConstraints.REMAINDER;
bottomC.gridx = 0;
bottomC.gridy = 1;
bottomC.insets = new Insets(2,2,2,2);
bottomC.weightx = 1.0;
bottomC.weighty = 0.5;
//add text areas to the panel
panel.add(top, topC);
panel.add(bottom, bottomC);
//create frame
frame = new JFrame();
frame.setTitle("Client Console");
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
frame.dispose();
}
});
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Put the text areas in a scroll pane.
You might also like to take a look at Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?.
And do you really need to use AWT? It's kind of out of date (like 15 years out of date). If you can consider using Swing or JavaFX instead...