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

时间:2013-01-14 14:53:17

标签: java swing size jpanel jcomponent

这是我的第一篇帖子,请原谅我,如果我做错了什么。

我的问题是:

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

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上检查了它,但如果有人可以为此发布一个干净的解决方案,我将不胜感激,在此先感谢。

4 个答案:

答案 0 :(得分:6)

您需要为Layout设置正确的Container。您setLayoutJFrame等容器JPanel,等等。您不会将其他组件添加到布局,而是添加到容器。然后它会相应地布局它们。这是它的工作原理。

通过适当的布局,您无需拨打setLocation()。另外setVisible(true)过多,因为true是代码中这些组件的默认值。

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

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

此外,您可以保存一些字节,而不是始终键入this.

答案 1 :(得分:2)

所有关于布局Swing layout

答案 2 :(得分:2)

对于JTextArea问题,请使用:

       JTextArea j=new JTextArea();
       j.setColumns(20);
       j.setRows(5);

更改setColumns()setRows()的值以改变大小; +关于Layout Managers的建议。

希望这有效;)

答案 3 :(得分:-1)

尝试使用jpanel的绝对布局。