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