我想知道如何从这段代码中检索字符串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 ++中的常量。
答案 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中,不在你编写此代码的方法内。