2013-07-14 52 views
0

我有一個簡單的應用程序,限制用戶的行數。 計算成功執行的行數。我使用documentListener從用戶捕獲事件。如何禁用JTextArea中的類型字符,但啓用刪除字符(Backspace)

但是,當來自用戶的輸入超過指定的行數時,所以我想禁止用戶再次輸入。但是,用戶仍然可以刪除他們輸入的字符。

我試過使用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; 
     } 
    } 
.... 
+1

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 –

+0

atleast post full code。 – Makky

+0

無法理解這個問題,在某種意義上說,一旦達到限制,您不希望用戶刪除輸入的數據(這導致了結論,即'JTextArea'內部的內容將保持爲是),那麼將JTextArea設置爲禁用狀態有什麼問題,因爲即使啓用了,仍然用戶不能執行任何操作,用戶既不能刪除也不能添加它。那麼現在需求究竟是什麼? –

回答

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); 
     } 
     } 
    }); 
+0

謝謝:)它的工作原理。我得到我想要的東西,並獲得新的知識。 :) – fanjavaid

相關問題