所以,这确实很烦人,并且同时进行了一场不可思议的魔术表演。因此,我有一个名为setAnagram
的全局字符串。我正在用Eclipse创建GUI,因此我想做的是让用户单击一个按钮,它启动另一个线程,并在该线程上获取文本字段的值。我这样做的方法是将setAnagram
设置为文本字段的值。
但是,这实际上不起作用,并且setAnagram
的值为空(“”)。因此,我想好了,如果将变量设置为null
,该怎么办。好吧,我得到了NullPointerException。
我想很好,如果变量实际上没有更改,并且在可以更改变量之前启动了线程该怎么办?好吧,我做到了,所以您一次按下按钮并对其进行更改,然后再次按下它,然后启动线程。这是奇怪的东西出现的地方。更改后,我在第一次单击按钮时打印出setAnagram
的值。但是,当我在单击下一个按钮时启动线程时,它又回到了初始化时的状态(“测试”)。这是单击按钮的代码:
decodeAnagramButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (buttonPresses == 0) {
setAnagram = chosenAnagram.getText(); // chosenAnagram is the text field
buttonPresses++;
decodeAnagramButton.setText("Click again");
System.out.println(setAnagram); // These two lines output the same thing
System.out.println(chosenAnagram.getText());
}
else {
titleText.setText("Decoding anagram...");
decodeAnagramButton.setVisible(false);
MainWindow thread = new MainWindow();
thread.start();
}
}
});
然后为了最小化,我不会添加线程代码,因为它有点长,只知道使用setAnagram
所做的就是获取值。为什么这会发生意外变化的任何想法?
答案 0 :(得分:1)
MainWindow thread = new MainWindow(); thread.start();
因此...您创建了MainWindow
的新实例(显然是线程?!?)。这意味着MainWindow
的新实例也有自己的setAnagram
成员变量,对吧?
尝试在这两行代码之间添加thread.setAnagram = this.setAnagram;
。
(此外,关于您的设计的一些气味令人讨厌,为什么主窗口是线程?)