我创建了一个使用FocusListener的应用程序,以确保文本内容的值始终为正值。当用户输入负值,然后单击"选项卡"将焦点移离文本字段的键,该值将乘以-1,以使结果值为正。但是,当我运行应用程序时,文本字段没有改变。我不确定我做错了什么,并会感激任何帮助。
这是我的代码:
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();
}
}
答案 0 :(得分: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 Subsystem和Validating Input
您还可以使用DocumentFilter
来限制用户实际输入的内容,并在用户输入时过滤输入。请特别注意Text Component Features和Implementing a Document Filter。
您还可以查看these examples以获取更多想法
答案 1 :(得分:1)
在方法中创建同名对象时,侦听器设置为方法对象而不是Class对象。