【问题标题】:java use size of JPanel to size componentsjava使用JPanel的大小来调整组件的大小
【发布时间】:2011-09-22 03:34:03
【问题描述】:

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

}

【问题讨论】:

  • 试试panel.getPreferredSize().width
  • @oliholz,正如您在上面的示例中看到的,我尝试过,但没有成功。当我打印出面板的首选尺寸时,它的宽度和高度为 2。但是当 Jframe 出现时,面板边框的大小几乎与整个 jframe 相同

标签: java swing size jpanel


【解决方案1】:

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

这是布局管理器的工作。

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

当布局管理器被调用时,容器将有一个有效的大小,因此布局管理器可以正确地完成它的工作。

您没有理由玩尺寸。让布局经理来完成他们的工作。

更新:

如果我希望我的 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。

【讨论】:

  • 所以你是说如果我对尺寸不满意,那么我一定是使用了错误的布局?
  • 是的,你可以嵌套不同的布局管理器来获得想要的效果。查看更新。
【解决方案2】:

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

您可以使用setPreferredWidth(...);但是,如果您的首选宽度是在程序运行期间发生变化(由于窗口大小发生变化),您将需要听取相关面板并随着面板的首选宽度变化更新按钮的首选宽度(假设它发生变化,这可能不是真的)。​​

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @Overbose,你能看看我编辑的例子并提供更多细节吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2013-10-11
    相关资源
    最近更新 更多