添加到 JPanel 时,Java Swing 组件没有正确的大小

标签 java swing size jpanel jcomponent

第一次发帖,如有不妥之处请见谅

我的问题是:

我正在尝试将组件添加到具有定义的大小等值的 JPanel。 但是当我将它们添加到面板时,它们绝对没有它们应有的大小和位置。 例如:

public class Console extends JFrame {
    private JPanel mainPanel = new JPanel();
    private JTextArea textField = new JTextArea();
    private JTextArea textField2 = new JTextArea();

    public Console() {
        this.setSize(500,300);

        this.mainPanel.setSize(this.getWidth(),this.getHeight());

        this.textField.setEditable(false);
        this.textField.setSize(this.mainPanel.getWidth(), 100);
        this.textField.setPreferredSize(new Dimension(this.mainPanel.getWidth(),this.mainPanel.getHeight()));
        this.textField.setLocation(0, 0);
        this.textField.setText("some text");
        this.textField.setVisible(true);

        this.textField2.setSize(this.mainPanel.getWidth(),200);
        this.textField2.setPreferredSize(new Dimension(this.getWidth(),this.getHeight()));
        this.textField2.setLocation(0,this.mainPanel.getHeight()-this.textField.getHeight());
        this.textField2.setText("blabla");
        this.textField2.setVisible(true);

        this.mainPanel.add(textField);
        this.mainPanel.add(textField2);
        this.mainPanel.setVisible(true);

        this.add(this.mainPanel);
        // I know you should not call setVisible() in the Constructor, just for making Code more simple here.
        this.setVisible(true);
    }
}

当我启动应用程序时,两个 JTextArea 都非常小并且位于中间某处(不像上面设置的那样),而 mainPanel 是正确的。我试图在代码的不同位置调用 setSize() 和 setPreferredSize(),但是它没有用。据我所知,我知道最好使用 LayoutManager 来执行此操作,但老实说,我不知道如何正确使用它。我在 Oracle Doc 上检查过它,但如果有人可以为此发布一个干净的解决方案,我将不胜感激,在此先感谢。

最佳答案

您需要为您的容器设置一个合适的布局。您可以为JFrameJPanel 等容器setLayout 等。您不会将其他组件添加到布局中,而是添加到容器中。然后它会相应地布局它们。这就是它的工作原理。

通过适当的布局,您将不需要调用 setLocation()。此外,setVisible(true) 过分了,因为 true 是代码中这些组件的默认值。

最好不要扩展 JFrame,而是扩展 JPanel 并将其添加到 JFrame。

请了解 EDT 和 SwingUtilities.invoketLater() 您需要使用它。

您还可以节省一些字节,而不是一直键入 this.

关于添加到 JPanel 时,Java Swing 组件没有正确的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14320735/

相关文章:

从另一个类调用时,Java PropertyChangeListener 不工作

android - 调整 DialogFragment 宽度和高度

java - Retrofit2 + RxJava + Jackson 默默失败

java - 如何在搜索 View 中强制写入大写?

java - JetBrains 使用哪些 GUI 库?

java - 为什么不能通过用不同大小的数组替换变量来重新分配数组的大小?

mysql - 维基百科转储表页面链接的问题

java - Google Foobar,字符串清理,测试失败 5

java - 我们应该使用什么客户端(java 或 rest)来为 Elasticsearch 中的数据建立索引?

java - Canvas fillRect() 未填充定义的 Canvas