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

java使用JPanel的大小来调整组件的大小,java,swing,size,jpanel,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); 编辑: 请

是否可以使用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();
}

}

当然可以,但请注意,结果取决于JPanel的布局管理器及其子组件的数量

是否可以使用JPanel的大小来设置JPanel内部组件的大小

这是布局管理器的工作

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

当调用布局管理器时,容器将具有有效的大小,以便布局管理器可以正确执行其工作

你没有理由玩弄尺码。让布局经理来完成他们的工作

更新:

如果我希望我的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();
}
BoxLayout试图遵守组件的最小/最大尺寸。在您的情况下,您应该能够执行以下操作:

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

或者更简单的方法是从边界布局开始。可以将标签添加到北面。然后创建另一个面板并将其添加到中心。

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


您可以使用
setPreferredWidth(…)
;但是,如果您的首选宽度在程序运行过程中发生变化(由于窗口大小的变化),则您需要监听相关面板,并在面板的首选宽度发生变化时更新按钮的首选宽度(假设它发生变化,这可能不是真的)。

请尝试
panel.getPreferredSize().width
@oliholz,正如你在我上面的例子中看到的,我试过了,但没有成功。当我打印出面板的首选尺寸时,它的宽度和高度为2。但是当Jframe出现时,面板边框的大小与整个Jframe相同much@Overbose,你能看一下我编辑的示例并给出更多细节吗?那么你是说如果我对尺寸不满意,那么我一定是使用了错误的布局?是的,你可以嵌套不同的布局管理器以获得所需的效果。请参阅更新。