奇怪的事情发生了。我有一个文本区域和一个按钮。当我在该区域输入文本时,按钮开始移动!请参阅随附的代码。我尝试添加更多面板层并设置组件对齐方式,但仍然会发生。
class MyFrame extends JFrame {
...
public MyFrame() {
super("example");
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
add(panel);
JTextArea _textArea = new JTextArea();
_textArea.setSize(800, 600);
panel.add(_textArea);
JButton btn = new JButton("Send");
panel.add(btn);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000, 800);
setVisible(true);
}
}
这到底是怎么回事? 一个组件如何影响另一个组件?
这一行:
_textArea.setSize(800, 600);
被忽略,因为组件父级的布局管理器决定了大小。 在您的情况下,该布局管理器就是您的BoxLayout。
布局管理器确定他们管理的组件的位置和大小。 那是他们的工作。 它们使用每个组件的最小大小、首选大小和最大大小来确定实际大小。 如果您想知道确切的算法,请阅读BoxLayout的文档。
通常,您可以通过设置其行和列来设置 JTextArea 的首选大小:
JTextArea _textArea = new JTextArea(20, 40);
JTextArea被设计为放置在JScrollPane中。 如果您不将其放在 JScrollPane 中,它可能无法按预期运行,尤其是当用户键入的文本多于其中可以容纳的文本时:
panel.add(new JScrollPane(_textArea));
您可能应该通读 JTextArea 的文档以更好地理解它。
BoxLayout
比BorderLayout
复杂得多,这正是您所需要的。边框布局使用一般方向,如NORTH
、EAST
、SOUTH
和WEST
,这非常简单。以下是获取所需内容的简单方法:
class MyFrame extends JFrame {
//...
public MyFrame() {
super("Example");
JTextArea textArea = new JTextArea();
textArea.setSize(800, 600);
add(textArea, BorderLayout.CENTER);
JButton btn = new JButton("Send");
add(btn, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000, 800);
setVisible(true);
}
}
也短了很多。