2009-01-26 61 views
4

我在JScrollPane中使用JTextArea如何限制JTextArea max行和列?

我想限制每行中可能的最大行數和最大字符數。

我需要字符串完全像在屏幕上,每行以'\ n'結尾(如果其後有另一行),用戶將只能在每個行中插入X行和Y字符線。

我試圖限制線條,但我不知道究竟有多少線條,因爲線環繞,線環繞在屏幕上直觀地開始新線條(由於JTextArea的寬度),但在組件的字符串中,實際上是同一行,沒有'\ n'來指示新行。我不知道如何在輸入時限制每行中的最大字符數。

有2個階段:

  1. 的與字符串的類型保留該用戶將不能夠鍵入更多然後在每行X線和Y字符。 (即使行換行只是可視化或用戶鍵入的'/ n')
  2. 將字符串插入到DB-在CLiking'OK'之後,即使用戶確實將每行將以「/ n」結尾的字符串沒有輸入它,線只是包裝可視。

如果我將數字字符放在行中並在行尾插入'/ n',那麼幾乎沒有什麼問題,這就是爲什麼我決定在兩個階段做到這一點。在第一階段,用戶正在打字,我寧願只限制它的視覺效果,強行扭曲或類似的東西。只有在我保存字符串的第二階段,我會添加'/ n',即使用戶沒有在行尾輸入它!

有沒有人有想法?


我知道,我將不得不使用的DocumentFilter OR StyledDocument中。

下面是示例代碼,僅限制線,以3:

private JTextArea textArea ; 
textArea = new JTextArea(3,19); 
textArea .setLineWrap(true); 
textArea .setDocument(new LimitedStyledDocument(3)); 
JScrollPane scrollPane = new JScrollPane(textArea 

public class LimitedStyledDocument extends DefaultStyledDocument 

    /** Field maxCharacters */ 
    int maxLines; 

    public LimitedStyledDocument(int maxLines) { 
     maxCharacters = maxLines; 
    } 

public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException { 
    Element root = this.getDefaultRootElement(); 
    int lineCount = getLineCount(str); 

    if (lineCount + root.getElementCount() <= maxLines){ 
     super.insertString(offs, str, attribute); 
    } 
    else { 
     Toolkit.getDefaultToolkit().beep(); 
    } 
} 

/** 
* get Line Count 
* 
* @param str 
* @return the count of '\n' in the String 
*/ 
private int getLineCount(String str){ 
    String tempStr = new String(str); 
    int index; 
    int lineCount = 0; 

    while (tempStr.length() > 0){ 
     index = tempStr.indexOf("\n"); 
     if(index != -1){ 
     lineCount++; 
      tempStr = tempStr.substring(index+1); 
     } 
    else{ 
     break; 
     } 
    } 
    return lineCount; 
    } 
} 
+0

沒有答案,但你可能最好使用文件過濾器。 – 2009-01-26 13:49:38

回答

1

以下爲我工作(而不是字符行至19):

public class LimitedLinesDocument extends DefaultStyledDocument 
{  
    private static final String EOL = "\n"; 

    private int maxLines; 

    public LimitedLinesDocument(int maxLines) 
    {  
    this.maxLines = maxLines; 
    } 

    public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException 
    {   
    if (!EOL.equals(str) || StringUtils.occurs(getText(0, getLength()), EOL) < maxLines - 1) 
    {  
     super.insertString(offs, str, attribute); 
    } 
    } 
} 

StringUtils.occurs方法如下:

public static int occurs(String str, String subStr) 
{  
    int occurrences = 0; 
    int fromIndex = 0; 

    while (fromIndex > -1) 
    {  
    fromIndex = str.indexOf(subStr, occurrences == 0 ? fromIndex : fromIndex + subStr.length()); 
    if (fromIndex > -1) 
    {  
     occurrences++; 
    } 
    } 

    return occurrences; 
} 
1

這是我的版本,基於尼克霍爾特的版本。

只是爲了記錄,這將用於原型,並沒有太多的測試(如果有的話)。

public class LimitedLinesDocument extends DefaultStyledDocument { 
    private static final long serialVersionUID = 1L; 

    private static final String EOL = "\n"; 

    private final int maxLines; 
    private final int maxChars; 

    public LimitedLinesDocument(int maxLines, int maxChars) { 
     this.maxLines = maxLines; 
     this.maxChars = maxChars; 
    } 

    @Override 
    public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException { 
     boolean ok = true; 

     String currentText = getText(0, getLength()); 

     // check max lines 
     if (str.contains(EOL)) { 
      if (occurs(currentText, EOL) >= maxLines - 1) { 
       ok = false; 
      } 
     } else { 
      // check max chars 
      String[] lines = currentText.split("\n"); 
      int lineBeginPos = 0; 
      for (int lineNum = 0; lineNum < lines.length; lineNum++) { 
       int lineLength = lines[lineNum].length(); 
       int lineEndPos = lineBeginPos + lineLength; 

       System.out.println(lineBeginPos + " " + lineEndPos + " " + lineLength + " " + offs); 

       if (lineBeginPos <= offs && offs <= lineEndPos) { 
        System.out.println("Found line"); 
        if (lineLength + 1 > maxChars) { 
         ok = false; 
         break; 
        } 
       } 
       lineBeginPos = lineEndPos; 
       lineBeginPos++; // for \n 
      } 
     } 

     if (ok) 
      super.insertString(offs, str, attribute); 
    } 

    public int occurs(String str, String subStr) { 
     int occurrences = 0; 
     int fromIndex = 0; 

     while (fromIndex > -1) { 
      fromIndex = str.indexOf(subStr, occurrences == 0 ? fromIndex : fromIndex + subStr.length()); 
      if (fromIndex > -1) { 
       occurrences++; 
      } 
     } 

     return occurrences; 
    } 
}