将输入限制在JTextArea中

时间:2017-09-13 04:36:40

标签: java swing jtextarea

我目前正在开发Matrix计算器的开源代码。我想要实现的是让用户只在JTextArea中输入数字。数字包括负数和十进制数。我的问题如下:

  1. 如何将用户输入限制在JTextArea中。 JTextArea应接受的输入是:数字(0-9),空格,小数点。例如,如果用户按下字母'a',则该字母不会出现在JTextArea中,并且他/她也会听到警告声。如果用户按下一个数字,例如'2',则添加到JTextArea。
  2. 或者我的第一个问题没有解决方案;这是我的替代方法。如何将actionListener添加到JTextArea。 Action Listener将用于验证用户对JTextArea的输入。我在这里使用Matrices,我希望用户只在文本区域输入数字,当用户按字母或其他符号时,程序会提示用户输入无效,用户必须只输入数字。如果有一个解决方案,我还想提前一步检查输入的数字是否代表一个有效的矩阵(列数;即用空格分隔的数字;所有行中必须相等)。
  3. Snapshot of the Matrix Calculator showing letters entered into the JTextArea

    我尚未对此进行任何编码,因为我不确定如何向我的JTextArea添加动作侦听器。

2 个答案:

答案 0 :(得分:-1)

我尝试为您制作解决方案,它只接受0到9之间的数字以及空格字符,点和换行符,您可以根据需要添加和删除其他约束。

jTextArea.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {

            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                // use your restriction logic here
                // allow only numeric
                Document doc = jTextArea.getDocument();
                try {
                String c = doc.getText(doc.getLength() - 1, 1);

                if(c.equals("0") || c.equals("1") || c.equals("2") || c.equals("3") || c.equals("4") || c.equals("5") || c.equals("6") || c.equals("7") || c.equals("8") || 
                        c.equals("9") || c.equals("0") || c.equals(".") || c.equals("-") || c.equals(" ") || c.equals("\n")) {

                } else {
                    String ss = doc.getText(0, doc.getLength()-1);
                    Runnable clearText = new Runnable() { 
                        public void run() { 
                            jTextArea.setText(ss); 
                        } 
                      }; 
                      SwingUtilities.invokeLater(clearText); 
                    jTextArea.setText(doc.getText(0, doc.getLength()-1));
                }
                } catch (BadLocationException e2) {
                    // TODO: handle exception
                }
            }

            @Override
            public void changedUpdate(DocumentEvent arg0) {

            }
        });

它可能不是完美的解决方案,但它可以帮助您完成任务

答案 1 :(得分:-1)

感谢@PramodYadav的帮助。我使用了代码片段,并使用java.awt.event.KeyEvent提取了以下内容,并使用String c = character.toString(java.awt.event.KeyEvent.getKeyChar());阅读每个按键。我相信别人会有更好的解决方案。
请参考下面的代码:

    JTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyTyped(java.awt.event.KeyEvent evt) {
            JTextAreaKeyTyped(evt);
        }   
    });

    private void taBKeyTyped(java.awt.event.KeyEvent evt) { 
        try{
            javax.swing.text.Document doc = taA.getDocument();
            String c = Character.toString(evt.getKeyChar());
            if (c.equals("\b") || c.equals("0") || c.equals("1") || c.equals("2") || c.equals("3") || c.equals("4") || c.equals("5") || c.equals("6") || c.equals("7") || c.equals("8") || c.equals("9") || c.equals("0") || c.equals(".") || c.equals("-") || c.equals(" ") || c.equals("\n")) {

            }
            else {
                javax.swing.JOptionPane.showMessageDialog(null, "Invalid key pressed. Please enter valid numbers, including:\n - Negative Numbers &\n - Decimal numbers");
                String ss = doc.getText(0, doc.getLength()-1);
                System.out.println(doc.getLength());
                //using lambda expression
                Runnable clearText; 
                clearText = () -> {
                    taA.setText(ss); 
                };
                javax.swing.SwingUtilities.invokeLater(clearText);
                JTextArea.setText(doc.getText(0, doc.getLength()-1));
            }
        }
        catch(HeadlessException | BadLocationException e) {
            System.out.println("Exception: " + e);
        }
    }  

如果我做得好并且我没有使用糟糕的编码方法,请告诉我。