java使用JPanel的大小来调整组件的大小

时间:2011-06-24 15:38:03

标签: java swing size jpanel

是否可以使用JPanel的大小来设置JPanel中组件的大小?当我尝试在JPanel上使用getHeight()或getWidth()时,它总是返回0.我知道一旦打包JFrame就会得到它的大小,但是如何使用JPanel的维度并将其应用于组件在里面吗?像这样的东西

JPanel panel = new JPanel();
JLabel label = new JLabel();
label.setWidth(panel.getWidth());
panel.add(label);

编辑: 请参阅下面的示例代码如果我希望我的Jlabel和我的JPanel一样宽,我该怎么办?在这种情况下使用boxlayout是错误的吗?

public class Main extends JFrame{

public Main(){
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
    panel.setBorder(BorderFactory.createLineBorder(Color.blue));

    JLabel label = new JLabel();
    label.setBorder(BorderFactory.createLineBorder(Color.red));
    label.setText("label1");
    label.setMinimumSize(panel.getPreferredSize());
    label.setPreferredSize(panel.getPreferredSize());
    panel.add(label);


    add(panel);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setSize(500,500);
    setVisible(true);
}

public static void main(String[] args)
{
    new Main();
}

}

3 个答案:

答案 0 :(得分:3)

  

是否可以使用JPanel的大小来设置JPanel中组件的大小?

这是布局管理器的工作。

  

当我尝试在JPanel上使用getHeight()或getWidth()时,它总是返回0

调用布局管理器时,Container将具有有效大小,以便布局管理器可以正常工作。

没有理由让你玩大小。留给布局经理来完成他们的工作。

更新

  

如果我希望Jlabel与JPanel一样宽,我该怎么办?在这种情况下使用boxlayout是错误的吗?

BoxLayout尝试遵守组件的最小/最大大小。在你的情况下,你应该能够做类似的事情:

JLabel label new JLabel("some text");
label.setBorder(....);
Dimension d = label.getPreferredSize();
d.width = 32767;
label.setMaximumSize( d );

或许更简单的方法是从BorderLayout开始。您可以将标签添加到NORTH。然后创建另一个面板并将其添加到CENTER。

答案 1 :(得分:1)

当然可以,但要小心结果取决于JPanel的布局管理器及其子组件的数量。

答案 2 :(得分:0)

设置宽度会忽略调整大小。 LayoutManagers通常会询问组件的首选宽度和高度,并在调整框架大小后扩展/收缩项目以保持视觉上吸引人的位置。因此,您最好的选择是利用布局管理器并报告“首选宽度”。

您可以使用setPreferredWidth(...);但是,如果您的首选宽度是要更改程序的运行(由于窗口大小更改),您将需要收听相关面板并更新按钮的首选宽度,因为面板的首选宽度会更改(这假设它更改) ,这可能不是真的。)