Java Swing 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://*.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