从ActionListener内部的JOptionPane初始化String

时间:2014-06-27 20:06:37

标签: java swing jbutton actionlistener joptionpane

我正在尝试使用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

3 个答案:

答案 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
   }
}