在输入时改变jTextField的内容。

问题描述 投票:1回答:2

我试图重置我的JTextField,以防输入空格。它把我抛了出来。

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
2个回答
1
投票

A DocumentListener 只适用于通知到底层的 DocumentJTextComponent. 你需要一个 DocumentFilter 此处


0
投票

文档监听器不应该修改文档的内容;当监听器收到修改通知时,修改已经完成。取而代之的是,编写一个自定义文档,覆盖insertString或remove方法,或者两者都覆盖。详情请参见监听文档上的更改。

(从 http:/docs.oracle.comjavasetutorialuiswingeventsdocumentlistener.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() 防止清除文本字段后出现空格。

© www.soinside.com 2019 - 2024. All rights reserved.