2015-05-13 2 views
0

У меня есть JButton и JLabel. Код написан так, что когда пользователь нажимает на кнопку, выполняемое действие изменяет текст JLabel и начинает делать некоторые вещи. Однако в действительности текст ярлыка не изменяется до тех пор, пока закончившийся материал не будет завершен.Свинг - проверка подлинности UI не происходит

Это код в кнопки действия

lbl.setText("Doing"); 
revalidate(); 
DoStuff(); 

текст лейбла не изменится до тех пор метода DoStuff возврата. Я знаю, что revalidate просто назначает вызов paint, поэтому я думаю, что это потому, что нить краски никогда не получает срез для изменения текста.

Как исправить это?

Репродуктивная программа. Вместо DoStuff() у меня есть while(true);, который имитирует то же поведение. Если вы запустите эту программу, вам придется ее убить, чтобы она могла выйти.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Util1 
{ 
    public static void main(String[] args) 
    { 
     new Util1(); 
    } 

    public Util1() 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new ExamplePane()); 

       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 


    protected class ExamplePane extends JPanel 
    { 
     public ExamplePane() 
     { 
      final JPanel panel = new JPanel(new GridBagLayout()); 

      JButton btn = new JButton("Do Stuff"); 
      final JLabel lbl = new JLabel("Status"); 
      add(btn); 
      add(lbl); 

      btn.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ae) 
       { 
        lbl.setText("Doing"); 
        revalidate(); 
        while(true); 
       } 
      }); 

     }    
    }   
} 

ответ

1

Дело в том, что действия в public void actionPerformed(ActionEvent ae) методы выполняются в свинге потоке. Изменения не отображаются до тех пор, пока не будут выполнены все действия. Вы можете, например, выполнить свой метод doStaff в другом потоке. Для получения дополнительной информации см. this topic. У меня такая же проблема.

Смежные вопросы