gpt4 book ai didi

java - JTextField 上的 FocusListener 不起作用

转载 作者:行者123 更新时间:2023-11-30 04:11:09 25 4
gpt4 key购买 nike

我创建了一个使用 FocusListener 来确保文本字段的值始终为正的应用程序。当用户输入负值,然后单击“tab”键将焦点从文本字段移开时,该值将乘以-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);
//...
}

Add 将焦点监听器附加到其上,但在 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获取更多想法

关于java - JTextField 上的 FocusListener 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19577854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com