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

问题描述 投票:0回答:2

我正在为我的程序中的错误消息设置一个JLabel,所以最初标签是空的label.setText(""),但是当出现错误时它应该改为像label.setText("Error, you have entered invalid data...")

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

Q1。这是为什么?

Q2。 setSize(x,y)setPreferredSize(Dimension(x,y))有什么区别?

Q3。是否必须对布局做任何事情?

提前谢谢您的解释!

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

java swing label
2个回答
5
投票

不要使用setSize方法。

layoutManage调用setSize,如GridBagLayout,用于布局子组件。当您明确调用setSize时,您正在使用GridBagLayout。最终,当GridBagLayout为自己的目的调用setSize时,它将撤消你的setSize调用。

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

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

但是,您不应该调用setPreferredSize。默认情况下,组件已经具有首选大小,并且几乎肯定比您可以提供的任何数字都要好。例如,JLabel的默认首选大小是足以容纳其文本,图标和边框的大小。

计算首选大小比你想象的要难。文字使用了多少像素? 12个字体的高度是多少像素? 12点不是12像素。 12点是12/72英寸。这是多少像素?这取决于用户的显示器和图形分辨率。所有这些都为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中每个组件(“卡”)的唯一标识符。你可以随心所欲地制作任何东西。


2
投票

setSize()函数设置的大小不基于任何LayoutManager。这就是为什么在使用LayoutManager时应该总是使用setPrefferedSize()。如果可能的Java尝试根据setPrefferedSize()输入设置Label的大小,setPrefferedSize()首先尝试符合LayoutManagers维度。

所以是的,它确实与布局有关。如果可能,您应该只在使用布局管理器时使用setPrefferedSize()。

© www.soinside.com 2019 - 2024. All rights reserved.