我了解到,在编写Java Swing程序时,我们应该将这些组件放入Java事件队列中,因为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
了。请告诉我关于这个错误的信息以及如何修复它。
谢谢 :)
example.setLablel
只是我的一个用来更新 GUI 的例子。我必须保存SwingExample
对象,以便另一个类能够更新它。 - hqtexample.setLabel
这一行添加注释时:实际上,我想要在其他类或方法之外的某些情况下,在“未来”设置标签文本。 - hqtSwingExample
设为类中的一个字段。这样它就可以被匿名内部类访问到了。同时,请确保你的SwingExample
实例在事件分发线程上使用。 - Duncan Jones