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);
    }
}

到底是什么谜?一个组件如何影响另一个组件?

BoxLayoutBorderLayout复杂很多,这就是你需要的。 BorderLayout使用了NORTHEASTSOUTHWEST这样的大方向,非常简单。这是获得所需内容的简单方法:

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 以更好地理解它。