0

我有一个简单的应用程序来限制用户的行数。计算成功执行的行数。我使用 documentListener 从用户那里捕获事件。

但是当用户的输入超过指定的行数时,我想禁用用户再次输入。但是,用户仍然可以删除他们输入的字符。

我尝试过使用 setEditable (false),但这种方法导致 JTextArea 无法再次永久编辑。

这是我的代码。

....
public Demo2() {
        initComponents();


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

            @Override
            public void insertUpdate(DocumentEvent e) {
                System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
                if (getLineCountAsSeen(textArea) > maxLine){
                    JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
                    try {
                        textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
                    } catch (BadLocationException ex) {
                        Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex.getMessage());
                    }
                } else {
                    lblLineCount.setText(String.valueOf(currentLine));
                }

            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
                if (getLineCountAsSeen(textArea) > maxLine){
                    JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
                    try {
                        textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
                    } catch (BadLocationException ex) {
                        Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    textArea.setEditable(true);
                    lblLineCount.setText(String.valueOf(getLineCountAsSeen(textArea)));
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
                if (getLineCountAsSeen(textArea) > maxLine){
                    JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
                    try {
                        textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
                    } catch (BadLocationException ex) {
                        Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    textArea.setEditable(true);
                    lblLineCount.setText(String.valueOf(getLineCountAsSeen(textArea)));
                }
            }
        });
    }

    public static int getLineCountAsSeen(JTextComponent txtComp) {
    Font font = txtComp.getFont();
        FontMetrics fontMetrics = txtComp.getFontMetrics(font);
        int fontHeight = fontMetrics.getHeight();
        int lineCount;
        try {
            int height = txtComp.modelToView(txtComp.getDocument().getEndPosition().getOffset() - 1).y;
            lineCount = height / fontHeight + 1;
        } catch (Exception e) { 
            lineCount = 0;
        }

        if (lineCount == 0) {
            System.out.println("Not Set!");
            return lineCount;
        } else {
            currentLine = lineCount;
            System.out.println("currentLine : "+currentLine);
            return currentLine;
        }
    }
....
4

1 回答 1

2

尝试放置 DocumentFilter 而不是 DocumentListener 之类的

 final AbstractDocument abstractDocument = (AbstractDocument) textArea.getDocument();

  abstractDocument.setDocumentFilter(new DocumentFilter()
    {
      @Override
      public void remove(final FilterBypass fb, final int offset, final int length) throws BadLocationException
      {
        super.remove(fb, offset, length);
      }

      @Override
      public void insertString(final FilterBypass fb,
                               final int offset,
                               final String string,
                               final AttributeSet attr) throws BadLocationException
      {

        if (getLineCountAsSeen(textArea) < 4)
        {
          super.insertString(fb, offset, string, attr);
        }
      }

      @Override
      public void replace(final FilterBypass fb,
                          final int offset,
                          final int length,
                          final String text,
                          final AttributeSet attrs) throws BadLocationException
      {
        if (getLineCountAsSeen(textArea) < 4)
        {
          super.replace(fb, offset, length, text, attrs);
        }
      }
    });
于 2013-07-15T06:59:10.653 回答