来自JTextArea中数字键盘的Java过滤器编号

时间:2019-02-27 13:03:07

标签: java swing

数字1的键代码在Java 49中,而数字键盘中数字1的键代码是97。 我有一个JTextArea,我需要防止从数字键盘插入数字。

我尝试过:

  • 使用DocumentFilter,但是在这里我没有按键代码

  • 使用ActionMap,在这里我可以匹配键代码,但不能阻止它添加到JTextArea文本

  • 最后一个选项是使用KeyListener。我想我可以使用KeyListener和一个外部变量,并将所需的数据保存在此变量中,但我希望有更好的方法可以做到这一点。 我知道没有直接的方法可以防止使用KeyListener插入密钥。

以后的编辑:使用ActionMap时,我无法删除最后一个字符,因为在将角色添加到JTextArea之前执行了“ actionPerformed”。我尝试过:

JTextArea jtf1 = new JTextArea();   
jtf1.getActionMap().put("handleReplaceable", new AbstractAction() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        System.err.println("Found replaceable original text is "+jtf1.getText());
        jtf1.setText(jtf1.getText().substring(0, jtf1.getText().length()-1));
    }
});

2 个答案:

答案 0 :(得分:0)

您可以将textArea中的String转换为字节数组。之后,使用for循环,您应该知道textArea中是否有数字。代码编号从48(对于数字0)开始,到57(9)(数字9)结束

答案 1 :(得分:0)

您可以在数字键盘键为JTextArea#setEditable(false)时使用pressed方法,然后在释放数字键时使用JTextArea#setEditable(true)

一个例子:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class IgnoreNumpad {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            final JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JTextArea area = new JTextArea();
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0, false), "disable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0, false), "disable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0, true), "enable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0, true), "enable");
            //Add all keys
            area.getActionMap().put("disable", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    area.setEditable(false); //When key pressed, set it non-editable
                }
            });
            area.getActionMap().put("enable", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    area.setEditable(true); //Key released, make it editable
                }
            });
            frame.add(area);

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