java - JTextArea 动态扩展(不需要)
java - JTextArea expands dynamically (undesired)
发生了奇怪的事情。我有一个文本区域和一个按钮。当我在该区域中键入文本时,按钮开始移动!请参阅附件代码。我尝试添加更多面板层并设置组件对齐方式,但它仍然发生。
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);
}
}
到底是什么谜?一个组件如何影响另一个组件?
BoxLayout
比BorderLayout
复杂很多,这就是你需要的。 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);
}
}
也短了很多。
这一行:
_textArea.setSize(800, 600);
被忽略,因为组件父组件的 LayoutManager 决定了尺寸。在您的情况下,LayoutManager 就是您的 BoxLayout。
LayoutManagers 确定它们管理的组件的位置和大小。那是他们的工作。他们使用每个组件的最小尺寸、首选尺寸和最大尺寸来决定实际尺寸。如果您想知道确切的算法,请阅读 BoxLayout’s documentation.
通常,您可以通过设置行和列来设置 JTextArea 的首选大小:
JTextArea _textArea = new JTextArea(20, 40);
JTextArea 旨在放置在 JScrollPane 中。如果你不把它放在 JScrollPane 中,它可能不会像你期望的那样运行,特别是如果用户键入的文本多于它可以容纳的文本:
panel.add(new JScrollPane(_textArea));
您可能应该通读 JTextArea’s documentation 以更好地理解它。
发生了奇怪的事情。我有一个文本区域和一个按钮。当我在该区域中键入文本时,按钮开始移动!请参阅附件代码。我尝试添加更多面板层并设置组件对齐方式,但它仍然发生。
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);
}
}
到底是什么谜?一个组件如何影响另一个组件?
BoxLayout
比BorderLayout
复杂很多,这就是你需要的。 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);
}
}
也短了很多。
这一行:
_textArea.setSize(800, 600);
被忽略,因为组件父组件的 LayoutManager 决定了尺寸。在您的情况下,LayoutManager 就是您的 BoxLayout。
LayoutManagers 确定它们管理的组件的位置和大小。那是他们的工作。他们使用每个组件的最小尺寸、首选尺寸和最大尺寸来决定实际尺寸。如果您想知道确切的算法,请阅读 BoxLayout’s documentation.
通常,您可以通过设置行和列来设置 JTextArea 的首选大小:
JTextArea _textArea = new JTextArea(20, 40);
JTextArea 旨在放置在 JScrollPane 中。如果你不把它放在 JScrollPane 中,它可能不会像你期望的那样运行,特别是如果用户键入的文本多于它可以容纳的文本:
panel.add(new JScrollPane(_textArea));
您可能应该通读 JTextArea’s documentation 以更好地理解它。