2017-10-14 286 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); 
    } 
}