从匿名类中检索数据

时间:2014-04-11 13:47:48

标签: java swing class

我想知道如何从这段代码中检索字符串textOperandValue:

final JTextField textOperand = new JTextField();
textOperand.setBounds(200,100,75,25);

//textOperand action Listener
textOperand.addActionListener( new ActionListener () {
  public void actionPerformed(ActionEvent e) {
    String textOperandValue = textOperand.getText();    
  }
});

所以我可以接受它,然后将它解析成一个double,以便稍后在程序中使用。我尝试将它设置为另一个字符串    String Input = " "; 但它说我必须将字符串初始化为 final String Input = " "; ,我学到的东西就像是C ++中的常量。

3 个答案:

答案 0 :(得分:1)

您在ActionListener中声明的任何变量都不会对其余代码可见。您需要设置一个范围更广的变量(来自侦听器内):

public class Listen
{
    String usefulResult = null;

    public Listen()
    {
        final JTextField textOperand = new JTextField();
        textOperand.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                Listen.this.usefulResult = textOperand.getText();
            }
        });
    }
}

这里我们使用" OuterClass.this"在不需要最终变量的情况下访问周围范围的技巧。

或者您需要在听众内部执行所有必要的工作(即,您没有"检索"值,您只需使用该值):

    public void doSomethingUseful(String usefulValue) { /* add code here */ }

    textOperand.addActionListener( new ActionListener ()
    {
        public void actionPerformed(ActionEvent e) 
        {
            doSomethingUseful(textOperand.getText());    
        }
    });

或者您可以使用第二种技术来调用更改变量值的setter方法,从而避免在事件侦听器中访问最终变量的问题:

public class Listen
{
    String usefulResult = null;

    public void setUseful(String usefulValue){
        usefulResult = usefulValue;
    }

    public Listen()
    {
        final JTextField textOperand = new JTextField();
        textOperand.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                setUseful(textOperand.getText());
            }
        });
    }
}

这取决于你想用TextField的值做什么。

答案 1 :(得分:0)

您无法访问匿名类的成员。在这种情况下,它甚至是方法中的局部变量,永远不可访问。

要么,你必须设置外部类成员的值,但要注意同步问题。

class MyClass {
  final JTextField textOperand = new JTextField();
  public String textOperandValue;

  public MyClass() {
    textOperand.setBounds(200,100,75,25);

    //textOperand action Listener
    textOperand.addActionListener( new ActionListener () {
      public void actionPerformed(ActionEvent e) {
        textOperandValue = textOperand.getText();   
      }
    });
  }

  public someOtherMethod() {
    // textOperandValue available here
    if (textOperandValue != null) 
      //is set
  }
}

或者,您必须在其他地方调用可以存储值的方法。

class MyClass {
  final JTextField textOperand = new JTextField();

  public MyClass() {
    textOperand.setBounds(200,100,75,25);

    //textOperand action Listener
    textOperand.addActionListener( new ActionListener () {
      public void actionPerformed(ActionEvent e) {
        someOtherMethod(textOperand.getText()); 
      }
    });
  }

  public someOtherMethod(String value) {
    System.out.println(value);
  }
}

或者,您创建一个(命名的)类,它是一个ActionListener,可以以可检索的形式存储该值。

class MyClass {
  final JTextField textOperand = new JTextField();
  public String textOperandValue;

  private class MyActionListener implements ActionListener {
    String value;

    public void actionPerformed(ActionEvent e) {
      value =textOperand.getText(); 
    }
  }

  MyActionListener l = new MyActionListener();

  public MyClass() {
    textOperand.setBounds(200,100,75,25);

    //textOperand action Listener
    textOperand.addActionListener(l);
  }

  public someOtherMethod() {
    if (l.value != null) 
      //is set
  }
}

或者,您只需执行操作方法中需要执行的操作:

class MyClass {
  final JTextField textOperand = new JTextField();

  public MyClass() {
    textOperand.setBounds(200,100,75,25);

    //textOperand action Listener
    textOperand.addActionListener( new ActionListener () {
      public void actionPerformed(ActionEvent e) {
        System.out.println(textOperand.getText());
      }
    });
  }
}

答案 2 :(得分:0)

如果textOperandValue是全局的(如果它在全局类中定义)变量,则它可以工作。 不在ActionListener中,不在你编写此代码的方法内。