当前位置: 首页 > 面试题库 >

Jtextfield和keylistener

江永安
2023-03-14
问题内容

我有一个JTextField(JT)在我尽快要按照用户类型"e",例如在里面,这个词"Example"被自动JTextField中写入。

我使用代码:

KeyListener keyListener = new KeyListener() {
    public void keyPressed(KeyEvent e) {
        jt.setText("Example");
    }
}

但这会"Examplee"在按下e时给出!有任何想法吗?非常感谢


问题答案:

不要KeyListener在文本组件上使用,存在一系列问题(未通知,突变异常,当用户将某些内容粘贴到字段时未通知),相反,您应该使用DocumentFilter

例如…

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class TextFieldExample {

    public static void main(String[] args) {
        new TextFieldExample();
    }

    public TextFieldExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTextField field = new JTextField(20);
                ((AbstractDocument)field.getDocument()).setDocumentFilter(new ExampleExpandingDocumentFilter());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(field);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ExampleExpandingDocumentFilter extends DocumentFilter {

        @Override
        public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
            System.out.println("I" + text);
            super.insertString(fb, offset, text, attr);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            if ("e".equalsIgnoreCase(text)) {
                text = "example";
            }
            super.replace(fb, offset, length, text, attrs); 
        }

    }

}


 类似资料:
  • 介绍 (Introduction) JTextField类是一个允许编辑单行文本的组件。 Class 声明 (Class Declaration) 以下是javax.swing.JTextField类的声明 - public class JTextField extends JTextComponent implements SwingConstants 字段 (Field)

  • 问题内容: 我想用setText()方法更新jlabel和jtextfield,但是它不起作用。但是,其余代码仍在工作。代码如下; 在这里,islemSureci是JLabel,而textFiled是JTextField。设置它们后,它不起作用。代码中的所有工作完成后,它们就会出现。请问原因是什么? 问题答案: 我认为您的意思是 “所有工作完成之后” 是从文件(您注释的行)中加载文本。我认为这段代

  • 主要内容:1 Java JTextField的介绍,2 Java JTextField的声明,3 Java JTextField的构造方法,4 Java JTextField的方法,5 Java JTextField的案例1,6 Java JTextField的案例21 Java JTextField的介绍 JTextField类的对象是一个文本组件,允许编辑单行文本。它继承了JTextComponent类。 2 Java JTextField的声明 我们来看一下javax.swing.JTex

  • 尝试在JTextField被更新时获取其值(插入字符、删除字符、更改字符),然后设置其值。 我遇到了“试图在通知中变异”的例外情况,导致我: 但是,决不能从文档侦听器中修改文本组件的内容。如果这样做,程序可能会死锁。相反,您可以使用格式化的文本字段或提供文档过滤器。从这里开始 我正在使用文档过滤器将JTextField的字符数限制为12,但我不知道如何在不使用文档侦听器的情况下检测JTextFie

  • 这是毁灭性的结果:http://imgur.com/xcudefm

  • 问题内容: 我希望用户仅输入字母或空格(如果用户输入其他字符),我想给jOptionPane消息,我已经搜索过,并且尝试了以下代码 但是现在无论我输入什么都会给出错误 现在我更改了代码 现在它仅在用户输入数字时发出消息。我该如何解决 问题答案: 使用一个,这是我制作的一个示例,它将仅接受字母字符和空格: