【问题标题】:Input for JTextAreaJTextArea 的输入
【发布时间】:2017-02-12 14:30:27
【问题描述】:

例如,如果键入的字符不是'x',有什么办法吗?比不采取任何行动。代码:

main_text_area.addKeyListener(new KeyListener()
         {
             public void keyTyped(KeyEvent e)
             {

             }

             public void keyPressed(KeyEvent e1)
             {

             char c ='x';
                 if!((e1.getKeyChar() == c))
                 {

                  //Do nothing at all

                 }
             }
             public void keyReleased(KeyEvent e2)
             { 
             } 

【问题讨论】:

    标签: java swing jtextarea keylistener


    【解决方案1】:

    最好不要在 Swing 文本组件中使用 KeyListener,因为这会干扰该组件的基本底层操作。此外,KeyListener 不会对通过任何其他方式(例如通过剪切和粘贴)添加或删除的文本产生任何影响。使用更高级别的侦听器要好得多。

    例如,如果您想收到任何文本更改的通知,无论是输入还是删除,那么您会想要使用 DocumentListener,因为它会通知您文本的任何更改,无论是来自按键输入还是来自剪切和粘贴。

    另一方面,如果您想过滤文本输入,甚至阻止某些文本输入,则将 DocumentFilter 附加到 JTextArea 的 Document。

    例如,您可以在 DocumentFilter 中放置一个 String#replaceAll(...),它会从字符串中删除所有非 X 字符。正则表达式 "[^xX]" 可以很好地解决这个问题。

    例如,

    import javax.swing.*;
    import javax.swing.text.PlainDocument;
    
    @SuppressWarnings("serial")
    public class DocFilterExample extends JPanel {
        private static final int ROWS = 30;
        private static final int COLS = 40;
    
        private JTextArea textArea = new JTextArea(ROWS, COLS);
    
        public DocFilterExample() {
            ((PlainDocument) textArea.getDocument()).setDocumentFilter(new XcharFilter());
    
            add(new JScrollPane(textArea));
        }
    
        private static void createAndShowGui() {
            JFrame frame = new JFrame("DocFilterExample");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new DocFilterExample());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }
    

    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    
    public class XcharFilter extends DocumentFilter {
        private static final String REGEX = "[^xX]";
    
        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
                throws BadLocationException {
            string = string.replaceAll(REGEX, "");
            super.insertString(fb, offset, string, attr);
        }
    
        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
                throws BadLocationException {
            text = text.replaceAll(REGEX, "");
            super.replace(fb, offset, length, text, attrs);
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的。 您已经在自己的问题中找到了答案。 下面解释了原因。或者,您可以将其添加到 keyPressed()在语义上与您的变体相同

      if(!(e1.getKeyChar() == 'x')); //Does nothing, notice the ';'!
      else {
          //Do something
      }
      

      要让它什么都不做,你需要留下一个空的身体——你已经做了一个例子。然后它符合标准,进入体内,什么都不做。

      【讨论】:

      • @user8 谢谢。但这里实际需要的是除了 x 之外的所有其他键都应该是无功能的。
      • 大多数 Swing 专家都不推荐这种方法。
      • 例如,这会随着剪切和粘贴而完全崩溃。
      猜你喜欢
      • 2018-02-21
      • 2023-03-24
      • 1970-01-01
      • 2014-11-21
      • 2014-06-18
      • 2013-09-05
      • 2016-04-22
      • 2019-04-14
      相关资源
      最近更新 更多