gpt4 book ai didi

java - 在 JLabel 上设置大小会取代 java 中的其他组件

转载 作者:行者123 更新时间:2023-12-01 07:18:26 26 4
gpt4 key购买 nike

我正在为程序中的错误消息设置 JLabel,因此最初标签为空 label.setText(""),但是当出现错误时,它应该更改为类似 label.setText("错误,您输入了无效数据...").

如果我在标签上使用setSize(x,y),它会在出现错误消息时强制其他组件移位。但使用 setPreferredSize(Dimension(x,y)) 不会影响它们。

Q1。这是为什么?

第二季度。 setSize(x,y)setPreferredSize(Dimension(x,y))

之间有什么区别

第三季度。它与布局有什么关系吗?

提前感谢您的解释!

附注我正在使用 GridBagLayout 在 JPanel 上定位我的组件。

最佳答案

不要使用 setSize 方法。

setSize 由 LayoutManager(如 GridBagLayout)调用,以布局子组件。当您显式调用 setSize 时,您正在与 GridBagLayout 作斗争。最终,当 GridBagLayout 出于自身目的调用 setSize 时,它​​将撤消您的 setSize 调用。

换句话说,任何对 setSize 的调用最终都会被父布局清除。

setPreferredSize 不会被删除。大多数 LayoutManager(包括 GridBagLayout)都会尽力尊重组件的首选大小。

但是,您不应该调用 setPreferredSize。默认情况下,组件已经有一个首选尺寸,并且几乎可以肯定它比您能想到的任何数字都要好。例如,JLabel 的默认首选尺寸是刚好足以容纳其文本、图标和边框的尺寸。

计算首选尺寸比您想象的要困难。文本使用多少像素? 12点字体有多少像素高? 12 点不是 12 像素。 12 点是 1272 英寸。那是多少像素?这取决于用户的显示器和图形分辨率。 Swing 渲染系统知道所有这些,并且 JLabel 使用所有这些信息来确定其默认的首选大小。您不应该尝试重新发明所有这些工作,也不应该尝试用更简单的东西来替换该工作,因为它是不够的。

如果您只是让 JLabel 保持其首选大小,GridBagLayout 将尽力适应它。如果窗口本身没有空间显示 JLabel 的新文本,您可能应该调用窗口的 pack()更改文本后的方法。

更新:这似乎是 XY problem —您确实想要一条可以显示和隐藏的消息。

您希望布局足够大,以便在创建消息文本后立即容纳它。这通常是通过CardLayout来完成的。 ,它允许您将多个组件放置在彼此的顶部,并且在任何给定时刻只有其中一个可见。由于您不想显示任何文本,因此最初您将添加一个空的 JLabel 作为 CardLayout 中的第一个组件,因此默认情况下会显示它:

JLabel label = new JLabel("Error, you have entered invalid data...");

CardLayout messageLayout = new CardLayout();
JPanel messagePane = new JPanel(messageLayout);
messagePane.add(new JLabel(), "blank");
messagePane.add(label, "message");

// Do not add label directly to your user interface.
// Add messagePane instead.
mainWindow.add(messagePane);

// ...

// Show message
messageLayout.show(messagePane, "message");

// ...

// Hide message
messageLayout.show(messagePane, "blank");
用户永远不会看到

“message”“blank”。它们只是 CardLayout 中每个组件(“卡片”)的唯一标识符。您可以将它们制作成您想要的任何东西。

关于java - 在 JLabel 上设置大小会取代 java 中的其他组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49038610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com