我创建了一个使用FocusListener来确保文本fieid的值始终为正的应用程序。当用户输入负值,然后单击“制表符”键将焦点从文本字段移开时,该值将乘以-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();
}
}
最佳答案
主要的问题是您正在隐藏变量
您声明
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了解更多信息