Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制对JTextArea的输入_Java_Swing_Jtextarea - Fatal编程技术网

Java 限制对JTextArea的输入

Java 限制对JTextArea的输入,java,swing,jtextarea,Java,Swing,Jtextarea,我目前正在为矩阵计算器编写一个开源代码。我试图实现的是让用户只在JTextArea中输入数字。数字包括负数和十进制数。我的问题如下: 如何将用户输入限制到JTextArea。JTextArea应该接受的输入是:数字(0-9)、空格和小数点。例如,如果用户按下字母“a”,该字母不会出现在JTextArea中,并且他/她会听到警告声。如果用户按下一个数字,例如“2”,则会将其添加到JTextArea中 或者我的第一个问题没有解决方案;这是我的另一种方法。如何将actionListener添加到JTe

我目前正在为矩阵计算器编写一个开源代码。我试图实现的是让用户只在JTextArea中输入数字。数字包括负数和十进制数。我的问题如下:

  • 如何将用户输入限制到JTextArea。JTextArea应该接受的输入是:数字(0-9)、空格和小数点。例如,如果用户按下字母“a”,该字母不会出现在JTextArea中,并且他/她会听到警告声。如果用户按下一个数字,例如“2”,则会将其添加到JTextArea中
  • 或者我的第一个问题没有解决方案;这是我的另一种方法。如何将actionListener添加到JTextArea。Action Listener将用于验证用户对JTextArea的输入。我在这里使用矩阵,我希望用户只在文本区域输入数字,当用户按字母或其他符号时,程序会提示用户输入无效,用户必须只输入数字。如果对此有解决方案,我还想进一步检查输入的数字是否表示有效矩阵(列数;即由空格表示的数字;所有行中必须相等)

  • 我还没有对此进行任何编码,因为我不知道如何将操作侦听器添加到我的JTextArea。

    我尝试为您提供一个解决方案,它只接受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) {
    
                }
            });
    

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

    谢谢@PramodYadav的帮助。我使用了您的代码片段,使用
    java.awt.event.KeyEvent
    并使用
    String c=character.toString(java.awt.event.KeyEvent.getKeyChar())读取每个按键,得出了以下结论:。我相信其他人会有更好的解决方案。
    
    请参阅下面的我的代码:


    请让我知道我是否做得很好,并且我没有使用糟糕的编码方法。

    JTextArea
    文档上使用
    DocumentFilter
    ,查看更多详细信息。关于如何使用
    JTextField
    上的
    DocumentFilter
    限制用户输入,有无数的例子,但概念是一样的,非常感谢大家。我使用了'code'java.awt.event.KeyEvent'code'并拾取每个按下的键,然后使用'code'字符串c=Character.toString(java.awt.event.KeyEvent.getKeyChar())进行检查;'当用户将文本粘贴到字段中时会发生什么?您的代码无法工作,正如已经说过的,很多次,最好的解决方案是使用
    DocumentFilter
    Thank@MadProgrammer。我想我没有考虑过。我会按照你的建议重新编码。非常感谢,非常感谢@PramondYadav。我将您的代码片段与“代码”java.awt.event.keyEvent“代码”一起使用,这对我来说非常有用。非常感谢。
    DocumentFilter
    是一个更好的解决方案,因为它不会冒从
    文档
    生成变异异常的风险,因为在
    文档
    发生变异时,您已经更改了组件,已经多次声明,
    KeyListener
    不是筛选任何文本组件的正确选择,这就是为什么存在
    DocumentFilter
    API,除了存在多个变异问题和不同平台执行不同操作的风险之外,这并没有考虑到如果用户将文本粘贴到组件或名为
    setText
    的代码中可能发生的情况,在这两种情况下,这两种情况都会绕过您的侦听器代码,
    DocumentFilter
    会捕捉到这一点
        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);
            }
        }