2013-10-24 44 views
1

我已经创建了一个使用的FocusListener确保文本fieid的价值始终是正的应用程序。当用户输入负值,然后单击“tab”键将焦点从文本字段移开时,该值将乘以-1,以使结果值为正值。但是,当我运行应用程序时,文本字段没有改变。我不确定我做错了什么,并会很感激任何帮助。的FocusListener上的JTextField不工作

这里是我的代码:

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class AlwaysPositive extends JFrame implements FocusListener { 
JTextField posField = new JTextField("30",5); 

public AlwaysPositive() { 
    super("AlwaysPositive"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel pane = new JPanel(); 
    JTextField posField = new JTextField("30",5); 
    JButton ok= new JButton("ok"); 
    posField.addFocusListener(this); 
    pane.add(posField); 
    pane.add(ok); 
    add(pane); 
    setVisible(true); 
} 

public void focusLost(FocusEvent event) { 
    try { 
     float pos = Float.parseFloat(posField.getText()); 
     if (pos < 0) 
      pos = pos*-1; 
     posField.setText("" + pos); 
    } catch (NumberFormatException nfe) { 
     posField.setText("0"); 
    } 
} 

public void focusGained(FocusEvent event) { 
} 

public static void main(String[] arguments) { 
    AlwaysPositive ap = new AlwaysPositive(); 
} 

}

回答

1

主要的问题是你是阴影的变量

您声明

JTextField posField = new JTextField("30",5); 

作为一个实例变量,但在你的构造函数,你重新声明它...

public AlwaysPositive() { 
    //... 
    JTextField posField = new JTextField("30",5); 
    posField.addFocusListener(this); 
    //... 
} 

添加焦点侦听器附加到它,但在focusLost方法,你指的是实例变量,这是不是一个,实际上是在屏幕

开始由内改变声明构造

public AlwaysPositive() { 
    //... 
    posField = new JTextField("30",5); 
    posField.addFocusListener(this); 
    //... 
} 

不过,也有更好的解决方案使用,然后FocusListener

例如,您可以使用InputVerifier,这将允许您验证字段的值并决定是否应移动焦点。

看看How to Use the Focus SubsystemValidating Input特别

你也可以使用一个DocumentFilter来限制哪些用户可以实际输入,滤波输入用户键入它。看看Text Component Features,特别Implementing a Document Filter

您还可以看看these examples更多的想法

+0

今天,我有'InputVerifier' [这里](http://stackoverflow.com/questions/19565839/input-verifier-effect-not-work-by-click-just-work-by-解释的问题制表键/ 19566591#19566591)。虽然问题不在于验证者,而是在于潜在的用例和设计。你介意看看吗? – Sage

+0

非常感谢您的详细解释! – user2533006

1

当你的方法中创建同名的对象,听者设置的方法对象,而不是Class对象。