【问题标题】:Length of Java Swing JTextArea? [duplicate]Java Swing JTextArea 的长度? [复制]
【发布时间】:2017-10-14 22:26:58
【问题描述】:

我有一个问题,在编码过程中弹出: 我想确定一下,关于这个问题,所以希望你能帮助我!

所以,我在想,JTextArea 的长度是无限的吗? 或者最多可以使用多少个字符?

我尝试手动编写它,但我很无聊,大约 5000 行和 100 000 个字符,那么 JTextArea 的限制是多少?

我正在开发一个聊天程序,这对我来说很重要,但我没有找到答案。

【问题讨论】:

  • 我建议长度可能固定为String 或数组的最大长度,小于Integer.MAX_VALUE
  • @SamDev 我认为 OP 不想限制字符数,但想知道 JTextArea 可以容纳的理论上的最大字符数
  • @MadProgrammer 可以看一下标题文字Length of Java Swing JTextArea?,是什么意思,请指正。
  • @SamDev “所以,我在想,JTextArea 的长度是无限的吗?或者最多可以使用多少个字符?” 会建议我他们有兴趣知道JTextArea 可以容纳的最大字符数 - 由于Document 的内部构成,我认为它与Integer.MAX_VALUE 绑定在一起

标签: java swing jframe limit jtextarea


【解决方案1】:

所以,我在想,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,这是一个关键的限制因素

【讨论】:

    【解决方案2】:

    我正在开发一个聊天程序,这对我很重要

    文本区域至少支持几本圣经的文本(即“很多”)。远远超出普通读者所能阅读的范围,远远超出“聊天程序”中的内容。

    这是一个小例子,显示了超过 110 万行的 Unicode 字符名称输出:

    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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      感谢 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 可能支持多少个字符
      • “JTextArea 是无限的” - 不是的。基于PlainDocument的实现,底层存储机制为char[],限制为小于Integer.MAX_VALUE,在大多数情况下,由于需要放置数组元素而小很多以连续的方式记忆。因为JTextArea 也能够返回文本的String,我们可以进一步暗示组件的限制必须是int 的最大长度,因为String#length 只返回一个int ...所有这些都是基本答案
      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2020-04-02
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多