我正在为我的程序中的错误消息设置一个JLabel,所以最初标签是空的label.setText(""),但是当出现错误时它应该改为类似的label.setText("Error, you have entered invalid data...").
如果我setSize(x,y)在标签上使用它,则会在发生错误消息时强制其他组件移位.但使用setPreferredSize(Dimension(x,y))并不影响他们.
Q1.这是为什么?
Q2.setSize(x,y)和之间有什么区别setPreferredSize(Dimension(x,y))
Q3.是否必须对布局做任何事情?
提前谢谢您的解释!
PS我正在使用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问题 - 你真的想要一个可以显示和隐藏的消息.
您希望您的布局足够大,以便在创建消息时立即容纳消息文本.这通常使用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");
Run Code Online (Sandbox Code Playgroud)
"message"并且"blank"从未被用户看到.它们只是CardLayout中每个组件("卡")的唯一标识符.你可以随心所欲地制作任何东西.
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |