如何创建忽略用户输入但允许组件修改文本的JTextField?

时间:2013-05-14 03:37:39

标签: java swing jtextfield

这是我想要的概念证明:我想要一个带有文本字段的框架和一个按钮。用户在文本字段中键入的任何内容都将被忽略,但如果单击该按钮,则会在文本字段中设置文本。你会怎么做?

我提前做了一些研究,并提出了一个解决方案,我将作为答案发布。但我担心的是,有一种更简单的方法可以做到这一点。我问这个问题,看看是否有更好的方法。

以下是我试图构建此概念证明的原因截图:

capture key inputs

我正在尝试像这样构建一些东西。当用户输入文本时,我想忽略他们所说的内容,捕获它并进行自己的解释。例如,如果用户按 control + Y ,我希望它这样说:

key input captured

我不想简单地让JTextField不可编辑,因为它会使框灰化并隐藏光标。我希望人们知道他们应该点击文本字段并输入。

4 个答案:

答案 0 :(得分:3)

如果要维护光标,可以按照here所述拦截击键。

以上链接的代码:

myTextField.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {
        char c = e.getKeyChar();
        if (!Character.isDigit(c)) {
            e.consume(); // Stop the event from propagating.
        }
    }
});

或者,您可以禁用输入,然后轻松恢复背景颜色,但会丢失光标:

textField.setEditable(false);
textField.setBackground(Color.WHITE);

答案 1 :(得分:1)

使文本字段不可编辑。用户无法输入数据,但程序仍然可以:

textField.setEditable(false);

答案 2 :(得分:1)

这是hendalst' code的编辑版本。它还会阻止 Ctrl + V 之类的内容,因为该事件也会在keyPressedkeyReleased方法中使用。

myTextField.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent ke) {
        ke.consume();
        // do what you want:
        myTextField.setText(...);
    }
    @Override
    public void keyPressed(KeyEvent ke) {
        ke.consume();
    }
    @Override
    public void keyReleased(KeyEvent ke) {
        ke.consume();
    }
});

答案 3 :(得分:0)

这段代码完全符合我的要求。但我希望有一个更简单的方法:

package com.sandbox;

import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Sandbox {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JTextField text = new JTextField();
        ((AbstractDocument) text.getDocument()).setDocumentFilter(new DocumentFilter() {
            @Override
            public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
//                super.remove(fb, offset, length);
            }

            @Override
            public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
//                super.insertString(fb, offset, string, attr);
            }

            @Override
            public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
//                super.replace(fb, offset, length, text, attrs);
            }
        });

        JPanel panel = new JPanel();
        BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
        panel.setLayout(layout);

        panel.add(text);
        JButton jButton = new JButton("Click to change text");
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DocumentFilter old = ((AbstractDocument) text.getDocument()).getDocumentFilter();
                ((AbstractDocument) text.getDocument()).setDocumentFilter(new DocumentFilter());
                text.setText("You clicked!");
                ((AbstractDocument) text.getDocument()).setDocumentFilter(old);
            }
        });
        panel.add(jButton);

        frame.setContentPane(panel);

        frame.pack();
        frame.setVisible(true);
    }


}