1

我有一个 JLabel 需要在按下按钮时动态更改。我正在使用 JLabel.setText(s)

但是,它不起作用。我试过了:

JLabel.repaint()
JLabel.validate()
JLabel.revalidate()

我觉得奇怪的是,当我不使用以下任何一种设置 JLabel 的大小时,它可以正常工作:

JLabel.setPrefferedSize()
JLabel.setMinimumSize()
JLabel.setSize()

任何人都可以帮助我解决为什么在我设置了一个尺寸属性后它不起作用?

4

4 回答 4

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();
}
于 2011-10-04T16:02:06.653 回答
1

对于 Swing 中的组件大小,最终父容器的布局对组件的大小拥有最终决定权。

例如,在FlowLayout、调用setPreferredSize()setSize()setMaximumSize()在组件上都具有给标签指定大小的结果,而不是超过它的大小。但是,setMinimumSize()它会从那个大小开始,然后是它上面的大小。

对于BorderLayout,如果将组件添加到中心,则任何大小调整方法都不会影响组件 - 它只会占用最大的可用空间。

但是,如果您将父容器的布局设置为null可以显式调整组件大小,那么您将失去使用其他布局的自动调整大小。

于 2011-10-04T16:04:41.947 回答
0

想通了我的问题,

我正在使用:

JLabel.setPreferredSize(100, JLabel.getheight());

我改为:

JLabel.setPreferredSize(100, 22);
于 2011-10-05T09:32:59.300 回答
-1

JLabel.setPreferredSize(100, JLabel.getheight());

由于您在此处设置首选尺寸,因此 JLabel 的高度之前一定没有设置过:),如果您在设置高度后尝试同一行,我认为它应该可以正常工作。

有时JPanel<xx>.updateUI();也需要刷新显示的 UI。enter code here

于 2013-03-21T15:21:05.183 回答