我正在尝试使用JOptionPane
为用户创建一个弹出窗口以提供一些输入。然后,我需要在其他地方使用该输入。我在The final local variable answer cannot be assigned, since it is defined in an enclosing type
中收到了answer
的错误actionPerformed(ActionEvent)
(见下文)。有没有办法让用户在弹出窗口中输入String
,同时允许主窗口有权访问String
?
final String answer;
JButton getAnswerButton = getAnswerButton();
getAnswerButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
answer = JOptionPane.showInputDialog("What is the answer?");
}
});
System.out.println(answer); //Need access to answer *outside* of my JButton
答案 0 :(得分:1)
当Java中的变量被解析为final
时,可以为变量赋值一次,但不能更改。
要更改值,您可能需要从摘录中删除final
。在您的情况下,您将得到另一个错误,即非最终局部变量不能在(匿名)内部类中使用(这可能是您首先添加final
的原因)。
根据应用程序的运行情况,将answer
作为类级别变量(而不是方法级别变量)是一种解决方案。
答案 1 :(得分:1)
让answer
成为班级中的字段成员。除非是final
,否则你根本无法引用内部类中方法中定义的局部变量,因为它应该是final
,你不能在内部类中再次分配它。使其成为final
的要求是由于内部类ActionListener
对调用内部类的方法中声明的变量所做的更改将不会对该方法可见。
更好的方法是:
public class YourClass {
String answer;
...
public void setButtonListener() {
JButton getAnswerButton = getAnswerButton();
getAnswerButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
answer = JOptionPane.showInputDialog("What is the answer?");
}
});
}
public void displayAnswer() {
System.out.println(answer); //Need access to answer *outside* of my JButton
}
}
您可以在设置期间调用setButtonListener
,这会在按钮上添加一个监听器来设置字段,然后您可以在单击按钮后访问该字段。
答案 2 :(得分:1)
首选选项是以答案作为参数调用受保护或私有方法。这样更方便,因为没有涉及成员字段,它可以将事物保持在一起。
public class YourClass {
public void setButtonListener() {
JButton getAnswerButton = getAnswerButton();
getAnswerButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String answer = JOptionPane.showInputDialog("What is the answer?");
displayAnswer(answer);
}
});
}
protected void displayAnswer(String answer) {
System.out.println(answer); //Need access to answer *outside* of my JButton
}
}