当前位置: 首页 > 知识库问答 >
问题:

JTextField 上的 FocusListener 不起作用

弓磊
2023-03-14

我创建了一个使用FocusListener的应用程序,以确保文本fieid的值始终为正数。当用户输入负值,然后单击“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();
}

}

共有2个答案

上官扬
2023-03-14

当您在方法中创建同名对象时,侦听器设置为方法对象而不是Class对象。

戚澄邈
2023-03-14

主要的问题是你在隐藏你的变量

你声明

 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,它将允许您验证字段的值并决定是否应该移动焦点。

看看如何使用焦点子系统,特别是验证输入

您还可以使用< code>DocumentFilter来限制用户实际可以输入的内容,在用户键入时过滤输入内容。看看文本组件特性,特别是实现文档过滤器。

你也可以看看这些例子来获得更多的想法

 类似资料:
  • 介绍 (Introduction) FocusListener接口用于接收键盘焦点事件。 处理焦点事件的类需要实现此接口。 类声明 以下是java.awt.event.FocusListener接口的声明: public interface FocusListener extends EventListener 接口方法 (Interface methods) SN 方法和描述 1 void f

  • 介绍 (Introduction) FocusListener接口用于接收键盘焦点事件。 处理焦点事件的类需要实现此接口。 Class 声明 (Class Declaration) 以下是java.awt.event.FocusListener接口的声明 - public interface FocusListener extends EventListener 接口方法 Sr.No. 方法和描

  • 我正在用JButtons和JTextFields制作一个程序。ActionListener适用于JButton,但不适用于JTextFields。 在我的Gui构造函数的中间,创建了“金额来自”TextField,然后我添加了一个actionListener。然后,在ActionHandler类的底部,我查找它的事件。但是,当我运行程序(单击“长度”)然后更改文本字段中的金额并按回车键时,我没有得

  • 我试图在最新的AndroidLollipop预览版本中使用elevation属性。我将targetSdk设置为21,将主题设置为Material。接下来,我在TextView中添加了一个背景形状,并将标高设置为8dp,但TextView没有显示任何阴影迹象。这是在运行Lollipop预览的Nexus7上。我还有什么要考虑的吗? 布局如下: 这是可绘制的背景: 以下是文本视图:

  • 问题内容: 我正在尝试将AngularJS用于我的第一个项目(锦标赛经理),并且筛选器不起作用:(我已阅读了有关该文档的所有文档,但无济于事:/ 所以,我在上面定义了vars : 现在,在我看来,我正在尝试重新排序(首先只有一个订单项),但是再也无法工作… 第二次,我要重新排序,从2条信息:和如果第一是平等的。我尝试更换这样的,但如果一个代码没有工作,他绝不会与2工作… 谢谢大家的阅读,对于帖子的

  • 我到处都搜索了,但找不到答案,我怎么能发出HTTP请求?我尝试了几种可能性,但都不起作用。我总是出错。 02-27 17:52:58.611 13571-13571/com.example.app E/AndroidRuntime﹕ 致命异常:主java.lang.IllegalStateException:无法在android.view.view$1.onClick(view.java:3838