我有一個問題,在編碼時彈出: 我想確定一下,關於這個問題,所以我希望你能幫助我!Java Swing JTextArea的長度?
那麼,我在想,JTextArea
長度是無限的嗎? 或者最多可以使用多少個字符?
我試圖寫它手動,但我厭倦了,約5000行,100000個字符,所以JTextArea
的限制是什麼?
我正在開發一個聊天程序,這對我很重要,但我找不到答案。
我有一個問題,在編碼時彈出: 我想確定一下,關於這個問題,所以我希望你能幫助我!Java Swing JTextArea的長度?
那麼,我在想,JTextArea
長度是無限的嗎? 或者最多可以使用多少個字符?
我試圖寫它手動,但我厭倦了,約5000行,100000個字符,所以JTextArea
的限制是什麼?
我正在開發一個聊天程序,這對我很重要,但我找不到答案。
感謝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
OP沒有試圖限制字符數量,但想知道最大限制是多少個字符可以支持「JTextArea」 – MadProgrammer
*「JTextArea是無限的」* - 不,它不是。基於'PlainDocument'的實現,底層存儲機制是'char []',它被限制爲小於'Integer.MAX_VALUE',在大多數情況下,由於需要數組元素以連續的方式放在記憶中。由於'JTextArea'也能夠返回文本的'String',我們可以進一步暗示組件的限制必須是int的最大長度,因爲'String#length'只返回一個'int'。 ..所有這些都是基本的答案 – MadProgrammer
所以,我考慮過這個問題,是的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
的鏈表實現,不要忘記,這兩個Document
和JTextArea
依靠String
,這是一個關鍵的限制因素
我工作的一個聊天程序,這對我來說是
重要的文本區域支持至少幾個聖經值得文字(即'很多')。遠遠超過了讀者的閱讀能力,遠遠超過了應該出現在「聊天程序」中。
這裏是一個小例子,其中顯示的Unicode字符的名稱超過110萬行輸出:像你這樣的
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);
}
}
結帳類似的問題https://stackoverflow.com/questions/13863795/enforce-max-characters-on-swing-jtextarea-with-a-few-curve-balls – 2017-10-14 22:30:40
我建議長度可能固定爲String或數組的最大長度, 'Integer.MAX_VALUE' – MadProgrammer
@SamDev我不認爲OP要限制字符的數量,但想知道理論「JTextArea」可容納的最大字符數 – MadProgrammer