我有一个JLabel,我需要在按下按钮时动态更改。我正在使用JLabel.setText(s)
但是,它不起作用。我试过了:
JLabel.repaint()
JLabel.validate()
JLabel.revalidate()
我发现奇怪的是,当我没有使用以下任何一个设置JLabel的大小时,它工作正常:
JLabel.setPrefferedSize()
JLabel.setMinimumSize()
JLabel.setSize()
在设置其中一个尺寸属性后,有人可以帮我解释它为什么不起作用吗?
答案 0 :(得分:2)
您的按钮正在执行的操作可能是一项非常漫长的任务,您希望让用户随时了解该过程。
要执行此操作,您必须创建一个执行长任务的新线程,当您为标签设置新文本时,将label.setText()
语句包装到invokeLater()
:
public void buttonAction()
{
new Thread(new Runnable()
{
public void run()
{
// Here your long task
// When you want to call Label.setText(), do it like this:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
label.setText("Loading 1/13...");
}
});
// Here another part of your task....
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
label.setText("Done!");
}
});
}
}).start();
}
答案 1 :(得分:1)
为了调整Swing中的组件大小,最终父容器的布局对组件的大小有最终决定权。
例如,在FlowLayout
中,在组件上调用setPreferredSize()
,setSize()
或setMaximumSize()
都会产生给标签大小的结果,而不会调整大小它。但是,对于setMinimumSize()
,它将以该大小开始,然后大小超过它。
对于BorderLayout
,如果将组件添加到中心,则没有任何大小调整方法会影响组件 - 它只占用最大可用空间量。
如果将父容器的布局设置为null
,则可以显式调整组件大小,但是,您将失去自动调整其他布局的大小。
答案 2 :(得分:0)
弄清楚我的问题,
我正在使用:
JLabel.setPreferredSize(100, JLabel.getheight());
我改为:
JLabel.setPreferredSize(100, 22);
答案 3 :(得分:-1)
JLabel.setPreferredSize(100,JLabel.getheight());
当你在这里设置首选尺寸时,JLabel的高度一定不能预先设置:),如果在设置高度后尝试相同的线,我认为它应该可以正常工作。
有时需要JPanel<xx>.updateUI();
来刷新显示的用户界面。enter code here