设置大小后,JLabel.setText()无法正常工作

时间:2011-10-04 15:42:37

标签: java swing jlabel jcomponent

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

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

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

我发现奇怪的是,当我没有使用以下任何一个设置JLabel的大小时,它工作正常:

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

在设置其中一个尺寸属性后,有人可以帮我解释它为什么不起作用吗?

4 个答案:

答案 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