2017-10-14 130 views
0

我有一個問題,在編碼時彈出: 我想確定一下,關於這個問題,所以我希望你能幫助我!Java Swing JTextArea的長度?

那麼,我在想,JTextArea長度是無限的嗎? 或者最多可以使用多少個字符?

我試圖寫它手動,但我厭倦了,約5000行,100000個字符,所以JTextArea的限制是什麼?

我正在開發一個聊天程序,這對我很重要,但我找不到答案。

+0

結帳類似的問題https://stackoverflow.com/questions/13863795/enforce-max-characters-on-swing-jtextarea-with-a-few-curve-balls – 2017-10-14 22:30:40

+1

我建議長度可能固定爲String或數組的最大長度, 'Integer.MAX_VALUE' – MadProgrammer

+0

@SamDev我不認爲OP要限制字符的數量,但想知道理論「JTextArea」可容納的最大字符數 – MadProgrammer

回答

0

感謝MadProgrammer糾正我。

如果你想設置的JTextArea的限制:

要實現文件過濾器,創建的DocumentFilter的子類,然後將其安裝到使用的是AbstractDocument類中定義的方法setDocumentFilter的文件。雖然可能有文檔不能從AbstractDocument中下載,但默認情況下,Swing文本組件使用AbstractDocument子類作爲其文檔。

TextComponentDemo應用程序具有文檔篩選器DocumentSizeFilter,該篩選器限制文本窗格可以包含的字符數。下面是創建過濾器,並將其附加到文本窗格中的文檔代碼:

JTextPane textPane; 
AbstractDocument doc; 
static final int MAX_CHARACTERS = 300; 
... 
textPane = new JTextPane(); 
... 
StyledDocument styledDoc = textPane.getStyledDocument(); 
if (styledDoc instanceof AbstractDocument) { 
doc = (AbstractDocument)styledDoc; 
doc.setDocumentFilter(new DocumentSizeFilter(MAX_CHARACTERS)); 
} 

來源:http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter

+0

OP沒有試圖限制字符數量,但想知道最大限制是多少個字符可以支持「JTextArea」 – MadProgrammer

+0

*「JTextArea是無限的」* - 不,它不是。基於'PlainDocument'的實現,底層存儲機制是'char []',它被限制爲小於'Integer.MAX_VALUE',在大多數情況下,由於需要數組元素以連續的方式放在記憶中。由於'JTextArea'也能夠返回文本的'String',我們可以進一步暗示組件的限制必須是int的最大長度,因爲'String#length'只返回一個'int'。 ..所有這些都是基本的答案 – MadProgrammer

3

所以,我考慮過這個問題,是的JTextArea長度無限?或者最多可以使用多少個字符?

不,JTextArea不是infinite

我們可以意味着基於這樣的事實,JTextArea只返回一個String,具有length返回一個int的最大長度。這意味着JTextArea的最大長度必須爲Integer.MAX_VALUE,但是,由於陣列開銷的原因,它的大小略小。但實際上,由於需要以連續的方式將數組放在內存中,因此可能會發現它更小,因此它將取決於JVM具有多少內存以及它是多麼分散。

我們可以進一步研究這一點,並看看PlainDocument,這是JTextArea使用的默認Document,它採用了char[],因爲它的內部數據結構,就像String

這進一步混凝土的理由,一個JTextArea的限制僅限於小於Integer.MAX_VALUE

你可以看看Do Java arrays have a maximum size?Why I can't create an array with large size?Why the maximum array size of ArrayList is Integer.MAX_VALUE - 8?了爲什麼一個數組不能被聲明爲Integer.MAX_VALUE

討論現在

,之前有人建議,你可以寫一個Document的鏈表實現,不要忘記,這兩個DocumentJTextArea依靠String,這是一個關鍵的限制因素

1

我工作的一個聊天程序,這對我來說是

重要的文本區域支持至少幾個聖經值得文字(即'很多')。遠遠超過了讀者的閱讀能力,遠遠超過了應該出現在「聊天程序」中。

這裏是一個小例子,其中顯示的Unicode字符的名稱超過110萬行輸出:像你這樣的

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class HowLongTextArea { 

    private JComponent ui = null; 

    HowLongTextArea() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JTextArea ta = new JTextArea(15, 40); 
     StringBuilder sb = new StringBuilder(); 
     String eol = System.getProperty("line.separator"); 
     for (int ii=0; ii<Character.MAX_CODE_POINT; ii++) { 
      sb.append((ii+1) + "\t" + Character.getName(ii) + eol); 
      if (ii%10000==0) { 
       System.out.println("ii: " + ii); 
      } 
     } 
     ta.setText(sb.toString()); 
     ui.add(new JScrollPane(ta)); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       HowLongTextArea o = new HowLongTextArea(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}