Java Swing 组件交互(BoxLayout 和 Label)

标签 java swing jpanel jlabel boxlayout

好的,关于下面的测试代码的几个问题...我没有完整的工作程序可以发布,但我希望人们足够了解 Swing 来尝试一下。这是 JPanel(BoxLayout) 内部的 JLabel,我正在调整右下角标签的大小。

我使用如图所示的代码得到的是一个 300 宽 x 30 高的状态框。我摆弄了首选尺寸和标签最小尺寸,它似乎没有以任何合理的方式表现。

  1. 为什么 JPanel Preferred Size 影响高度而不影响高度 宽度?如果我将 setPreferredSize() 中的 x 尺寸更改为 0 或 500,标签上的数字仍然是 300。
  2. 为什么 JLabel 最小尺寸影响宽度而不影响宽度 高度?如果我评论 setPreferredSize() 调用并增加 标签高度设置为 30,没有任何反应。
  3. 我开始使用 JPanel setMinimumSize (已注释),但它不再有任何 效果 - 为什么 JPanel 需要 setPreferredSize()?
  4. 如果我将标签文本从“”更改为“”,则会增加高度 标签的。由于此处标签不控制高度, 为什么这会产生任何影响?

顺便说一下,createRigidArea() 调用是强制分隔符位于右侧,而不是固定在屏幕的左侧。如果有任何不那么笨拙的想法,我将不胜感激。

    private JComponent makeStatusBarTest() {
    JPanel statusPanel = new JPanel();
    statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.LINE_AXIS));
    statusPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
//  statusPanel.setMinimumSize(new Dimension(0, 30));
    statusPanel.setPreferredSize(new Dimension(500, 30));
    JLabel statusLabel = new JLabel();
    Border emptyBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10);
    statusLabel.setBorder(emptyBorder);
    statusLabel.setText("");
    statusLabel.setMinimumSize(new Dimension(300, 20));
    statusPanel.add(statusLabel);
    statusPanel.add(new JSeparator(SwingConstants.VERTICAL));
    statusPanel.add(Box.createRigidArea(new Dimension(5000,0)));

    return statusPanel;
}

最佳答案

我可以解释#1 和#2:

摘自 BoxLayout javadocs:“BoxLayout 尝试按照组件的首选宽度(对于水平布局)或高度(对于垂直布局)来排列组件。”

换句话说,BoxLayout 使用内部组件(在您的例子中为 statusLabel)来决定宽度,但 JPanel 本身(在合理范围内)来决定高度 .

您通常可以使用 Glue 而不是 RigidArea 来移动东西,但我同意这需要一些时间来适应。

#4 Swing 效率太高 - 如果 JLabel 为空,则文本矩形为 0x0。最终在SwingUtilities.layoutCompoundLabelImpl()中确定。

我认为#3 是因为 BoxLayout 试图尊重内部组件的首选大小。因为 setMinimumSize 可以说会覆盖它们的首选大小。

关于Java Swing 组件交互(BoxLayout 和 Label),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383444/

相关文章:

java - 有没有办法从异步方法绘制到 JPanel 上?

java - JPanel 使用 mouseMoved 方法闪烁

java - 消失时可调整大小的布局 Swing JPanel

java - ArrayList 中的图形

java - 使用文件名作为 FileReader 的输入

java - 带 ARM 的 Box2d 旋转关节车辆

java - 360 度的正弦值非零

java - Error readLine() Java读取错误行

java - 替换 JTable 的组合框编辑器

java - 当鼠标悬停在 jlable 上时将显示图片的面板