2012-08-24 33 views
3

我已经阅读了关于编程Java Swing时,我们应该将这些组件放入Java事件队列中,因为Java Swing线程不是线程安全的。Java事件队列:如何更新JFrame中的组件

但是,当我使用Event Queue时,我不知道如何更新组件属性(例如:为标签设置文本或更改内容..)。这里是我的代码:

public class SwingExample { 

    private JLabel lblLabel;  
    SwingExample(){ 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     lblLabel = new JLabel("Hello, world!", JLabel.CENTER); 
     frame.getContentPane().add(lblLabel); // adds to CENTER 
     frame.setSize(200, 150); 
     frame.setVisible(true); 

    } 

    public void setLabel(){ 
     lblLabel.setText("Bye Bye !!!"); 
    } 



    public static void main(String[] args) throws Exception 
    { 
     SwingExample example = null; 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       example = new SwingExample(); // ERROR : Cannot refer to non-final variable inside an inner class defined in different method 
      } 
     }); 

     // sometime in the futures, i want to update label, so i will call this method... 
     example.setLabel(); 
    } 

} 

我知道,如果我写SwingExample example = new SwingExample();错误不会再次出现,但如果我使用,我无法处理example.setLabel后。

请告诉我有关此错误以及如何解决此问题。

谢谢:)

+0

@AndrewThompson'example.setLablel'就是我更新图形用户界面的示例。我必须保存另一个类的SwingExample对象来更新它。 – hqt

+0

我误解了源代码,请忽略我的第一条评论。为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)(最佳尝试),并提供两个课程。 –

+0

@AndrewThompson当我添加注释到'example.setLabel'这一行时:实际上,我想在某些情况下在其他类或其他方法的“未来”中设置标签文本。 – hqt

回答

3

通过让SwingExample实例作为一个字段,你可以参考它的内部类中没有它final

public class SwingExample { 

    private JLabel lblLabel;  
    private static SwingExample instance;  

    SwingExample() { 
     // code omitted 
    } 

    public void setLabel() { 
     lblLabel.setText("Bye Bye !!!"); 
    } 

    public static void main(String[] args) throws Exception { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       instance = new SwingExample(); 
      } 
     }); 

     // ... 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       instance.setLabel(); 
      } 
     }); 
    } 
}