在JLabel上设置大小取代了java中的其他组件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JLabel上设置大小取代了java中的其他组件相关的知识,希望对你有一定的参考价值。
我正在为我的程序中的错误消息设置一个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
上定位我的组件。
不要使用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中每个组件(“卡”)的唯一标识符。你可以随心所欲地制作任何东西。
setSize()函数设置的大小不基于任何LayoutManager。这就是为什么在使用LayoutManager时应该总是使用setPrefferedSize()。如果可能的Java尝试根据setPrefferedSize()输入设置Label的大小,setPrefferedSize()首先尝试符合LayoutManagers维度。
所以是的,它确实与布局有关。如果可能,您应该只在使用布局管理器时使用setPrefferedSize()。
以上是关于在JLabel上设置大小取代了java中的其他组件的主要内容,如果未能解决你的问题,请参考以下文章