我已经读过有关Java Swing编程的信息,我们应该将这些组件放入Java Event Queue,因为Java Swing线程不是线程安全的.
但是,当我使用事件队列时,我不知道如何更新组件属性(例如:为标签设置文本或更改某些内容.).这是我的代码:
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.
请告诉我有关此错误以及解决方法.
谢谢 :)
最佳答案
通过将SwingExample实例作为字段,您可以在内部类中引用它而无需最终确定.
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();
}
});
}
}