我创建了一个使用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 SubsystemValidating Input

您也可以使用DocumentFilter限制用户实际输入的内容,并在用户键入输入内容时对其进行过滤。特别看一下Text Component FeaturesImplementing a Document Filter

您也可以查看these examples了解更多信息

08-28 05:19