JLabel.setText () не работает после установки размера - PullRequest
1 голос
/ 04 октября 2011

У меня есть JLabel, который требуется динамически менять при нажатии кнопки.Я использую JLabel.setText (s)

Однако, это не работает.Я пробовал:

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

Мне кажется странным то, что он работает нормально, когда я не устанавливаю размер JLabel, используя любой из:

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

Может кто-нибудьпомогите мне понять, почему он не работает после установки одного из свойств размера?

Ответы [ 4 ]

2 голосов
/ 04 октября 2011

То, что делает ваша кнопка, вероятно, очень длинная задача, и вы хотите держать пользователя в курсе процесса.

Для этого вам нужно создать новый поток, который выполняет длинную задачу, и когда вы устанавливаете новый текст для вашей метки, оберните оператор 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 голос
/ 04 октября 2011

Что касается определения размеров компонентов в Swing, в конечном итоге макет родительского контейнера имеет решающее значение для размера компонента.

Например, в FlowLayout вызов setPreferredSize(), setSize() или setMaximumSize() для компонента приводит к тому, что метка имеет размер, а не его размер. Однако, с setMinimumSize() он начнется с этого размера, а затем с размером выше него.

Для BorderLayout, если компонент добавляется в центр, ни один из методов определения размера не влияет на компонент - он просто занимает максимальный объем доступного пространства.

Если вы установите макет родительского контейнера на null, вы можете явно указать размеры компонентов, однако вы потеряете автоматическое изменение размера, которое вы используете для других макетов.

0 голосов
/ 21 марта 2013

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

Поскольку вы устанавливаете здесь предпочтительный размер, высота JLabel не должна быть предварительно установлена ​​:),если вы попробуете ту же строку после установки высоты, я думаю, что она должна работать хорошо.

Также иногда JPanel<xx>.updateUI(); требуется для обновления отображаемого интерфейса. enter code here

0 голосов
/ 05 октября 2011

Понял мою проблему,

Я использовал:

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

Я изменил на:

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