2012-01-16 22 views
2

我需要在鍵入X後不允許輸入任何字符。我需要在鍵入X個字符後發出嗶聲。我知道如何在用戶按下輸入後執行此操作,但我需要在用戶按下輸入前執行此操作。我從Oracle網站找到的方法是將一個DocumentSizeFilter添加到JTextPane。我不能在用戶結束時通知用戶(直到他們按下回車鍵才能工作)。這是我所擁有的一個樣本。如何限制用戶鍵入的JTextPane中的字符數量(Java)

public class EndCycleTextAreaRenderer extends JTextPane 
implements TableCellRenderer { 

private final int maxNumberOfCharacters = 200; 

public EndCycleTextAreaRenderer() { 
    StyledDocument styledDoc = this.getStyledDocument(); 
    AbstractDocument doc; 
    doc = (AbstractDocument)styledDoc; 
    doc.setDocumentFilter(new DocumentSizeFilter(maxNumberOfCharacters)); 

} 
+2

渲染從來沒有發出蜂鳴聲;-),請務必瞭解渲染與編輯 – kleopatra 2012-01-17 10:45:56

回答

6

覆蓋在JTextPane所以文檔的insertString方法,一旦最大已經達到它不插入任何字符。

例如:

JTextPane textPane = new JTextPane(new DefaultStyledDocument() { 
    @Override 
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 
     if ((getLength() + str.length()) <= maxNumberOfCharacters) { 
      super.insertString(offs, str, a); 
     } 
     else { 
      Toolkit.getDefaultToolkit().beep(); 
     } 
    } 
}); 

更新:

你可以改變你的類如下:

public class EndCycleTextAreaRenderer extends JTextPane implements TableCellRenderer { 

    private final int maxNumberOfCharacters = 200; 

    public EndCycleTextAreaRenderer() { 
     setStyledDocument(new DefaultStyledDocument() { 
      @Override 
      public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 
       if ((getLength() + str.length()) <= maxNumberOfCharacters) { 
        super.insertString(offs, str, a); 
       } else { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 
     }); 
    } 
} 
+1

+ 1,對於較短的方法,我要通過我的答案告訴他整個聖經,你用一種方法做了什麼: - )問候 – 2012-01-16 16:59:01

+0

我很抱歉成爲這樣的noob,但我在哪裏使用此代碼?我的類EndCycleTextAreaRenderer應該重寫insertString嗎? – Boundless 2012-01-16 17:04:29

+3

+1 for'beep()':) – 2012-01-16 17:05:07

0

我建議檢查字符#通過添加一個keyReleasedListener進入到每一個關鍵,這是我在我最近的GUI用於檢查看似瞬間範圍和顯示錯誤給用戶,因爲他們打出來。

這裏是我是如何實現它在我的TextField的一個:

carbonTextField.addKeyListener(new java.awt.event.KeyAdapter() 
{ 
     public void keyReleased(java.awt.event.KeyEvent evt) 
     { 
      carbonTextFieldKeyReleased(evt); 
     } 
}); 
+0

概念你的意思一個自定義的keyListener? – Boundless 2012-01-16 16:51:32

+0

我編輯了我的原始文章以顯示我如何添加keyreleased監聽器。這允許你每次檢查你的界限(基本上允許你進入你自己的方法每個keyPress,這將允許你檢查嗶嗶聲或不。) – Alex 2012-01-16 16:55:38

+0

+1爲您提供的信息,毫無疑問,這是好的,但現在在Swing中使用KeyEvents通常不是一個好主意。問候 – 2012-01-16 17:10:06

2

下面是一個簡單的程序,你在哪裏,當你進入第四次進入TextPane時它會發出嗶聲,甚至沒有你按下輸入鍵:

import javax.swing.*; 
import javax.swing.text.*; 

import java.awt.Toolkit; 

public class TextPaneLimit extends JFrame 
{ 
    private JPanel panel; 
    private JTextPane tpane; 
    private AbstractDocument abDoc; 

    public TextPaneLimit() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     panel = new JPanel(); 
     tpane = new JTextPane(); 

     Document doc = tpane.getStyledDocument(); 
     if (doc instanceof AbstractDocument) 
     {  
      abDoc = (AbstractDocument)doc; 
      abDoc.setDocumentFilter(new DocumentSizeFilter(3)); 
     } 

     panel.add(tpane); 

     add(panel); 
     pack(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        new TextPaneLimit().setVisible(true); 
       } 
      }); 
    } 
} 

class DocumentSizeFilter extends DocumentFilter { 

    private int max_Characters; 
    private boolean DEBUG; 

    public DocumentSizeFilter(int max_Chars) { 

     max_Characters = max_Chars; 
     DEBUG = false; 
    } 

    public void insertString(FilterBypass fb 
          , int offset 
           , String str 
           , AttributeSet a) 
    throws BadLocationException { 

     if (DEBUG) { 

     System.out.println("In DocumentSizeFilter's insertString method"); 
     } 

     if ((fb.getDocument().getLength() + str.length()) <= max_Characters) 
     super.insertString(fb, offset, str, a); 
     else 
     Toolkit.getDefaultToolkit().beep(); 
    } 

    public void replace(FilterBypass fb 
         , int offset, int length 
         , String str, AttributeSet a) 
    throws BadLocationException { 

     if (DEBUG) { 
     System.out.println("In DocumentSizeFilter's replace method"); 
     } 
     if ((fb.getDocument().getLength() + str.length() 
      - length) <= max_Characters) 
     super.replace(fb, offset, length, str, a); 
     else 
     Toolkit.getDefaultToolkit().beep(); 
    } 
} 

希望這可能會有所幫助。

+0

是的,我試過這個例子甲骨文的網站在用戶按下某個鍵時沒有所需的嗶聲。 – Boundless 2012-01-16 19:12:45

+0

@Boundless:請檢查這個程序,我剛剛提出,在這裏你不必按任何回車鍵來發出嗶嗶聲。只需嘗試添加第四個字符併發出嗶聲。問候 – 2012-01-16 19:40:51

+0

我試過了,它可以根據需要使用。謝謝,我會嘗試使用它來滿足我的需求。 – Boundless 2012-01-16 19:48:19

0

檢查下面的代碼:

txtpnDesc.addKeyListener(新KeyAdapter(){

 @Override 
     public void keyTyped(KeyEvent e) { 
      if(txtpnDesc.getText().length() == 30) 
      { 
       e.consume(); 
      } 

     } 
    }); 
相關問題