【问题标题】:Changing the content of jTextField while typing键入时更改 jTextField 的内容
【发布时间】:2013-09-17 00:17:21
【问题描述】:

我正在尝试重置我的 JTextField,以防键入 Space。它把我扔了:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification

我的代码是:

import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class MainFrame extends JFrame {

    private JPanel contentPane;
    private JTextField textField;

    /** * Launch the application. */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /** * Create the frame. */
    public MainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JDesktopPane desktopPane = new JDesktopPane();
        desktopPane.setBackground(Color.LIGHT_GRAY);
        desktopPane.setBounds(6, 6, 438, 266);
        contentPane.add(desktopPane);

        textField = new JTextField();
        textField.getDocument().addDocumentListener(new DocumentListener() {
            public void changedUpdate(DocumentEvent e) {
            }

            public void removeUpdate(DocumentEvent e) {
            }

            public void insertUpdate(DocumentEvent e) {
                if (textField.getText().contains(" ")) {
                    System.out
                            .println("Space was entered! clearing the  text field");
                    textField.setText("");
                }
            }
        });
        textField.setBounds(133, 112, 134, 28);
        desktopPane.add(textField);
        textField.setColumns(10);
    }
}

【问题讨论】:

    标签: java swing while-loop jtextfield


    【解决方案1】:

    DocumentListener 仅适用于通知JTextComponent 的底层Document。你需要一个DocumentFilter这里

    【讨论】:

    • 他没有在 EDT 之外修改Document (Exception in thread "AWT-EventQueue-0")
    • 是的,与其深入研究机制,不如将用户重定向到合适的示例
    【解决方案2】:

    文档监听器不应该修改文档的内容;到侦听器收到更改通知时,更改已经完成。相反,编写一个自定义文档来覆盖 insertString 或 remove 方法,或两者​​兼而有之。有关详细信息,请参阅侦听文档的更改。

    (来自http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html

    我相信实现 KeyListener 比编写自定义文档更容易,如下所示:

    JTextField textField = new JTextField();
    textField.addKeyListener( new KeyListener() {
    
    @Override
    public void keyTyped(KeyEvent arg0) {
        if(arg0.getKeyChar() == ' '){
            System.out.println("Space was entered! clearing the  text field");
            textField.setText("");
            arg0.consume();
        }
    
    }
    
    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    
    }
    
    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
    
    }
    

    arg0.consume() 在清除文本字段后防止出现空格

    【讨论】:

    • 是否可以对 java 框架外的任何文本字段执行相同的操作?例如:当我在谷歌的搜索引擎中输入内容并按空格键时,它会删除我写的所有内容
    • 没有KeyListenerJTextComponent。自定义文档是一个选项,就像DocumentFilter
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2021-05-05
    • 1970-01-01
    • 2015-02-08
    • 2014-04-14
    • 2015-12-02
    • 2012-12-06
    相关资源
    最近更新 更多