【问题标题】:How to display very large strings i.e exceeding 1 million characters in a JTextArea?如何在 JTextArea 中显示非常大的字符串,即超过 100 万个字符?
【发布时间】:2023-03-20 15:27:01
【问题描述】:

当用户从 JList 中选择序列 ID 时,我正在创建一个基本的 Swing GUI,它在 JTextArea 中显示非常大的字符串(序列)。当序列字符串长度

但是,当序列超过 400,000 个字符时,JTextArea 上显示的序列将被覆盖且难以辨认 如何在 JTextArea 中显示非常大的字符串而不破坏这些大(>=400,000 个字符)字符串?

我的代码:

public class GUI {
    private String[] stringArr;
    JList<String> idList;
    private JTextArea seqArea;
    Map<String, String> sequences;

    public void init() {
        JFrame frame = new JFrame();
        JPanel seqPanel = new JPanel();
        stringArr = new String[0];
        idList = new JList<>();
        idList.addListSelectionListener(new SeqListSelectionListener());
        idList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        JScrollPane scroller = new JScrollPane(idList);
        idList.setVisibleRowCount(12);
        seqPanel.add(scroller);
        idList.setListData(stringArr);
        seqArea = new JTextArea(15, 50);
        seqArea.setLineWrap(true);
        seqArea.setCaretPosition(0);
        seqArea.setEditable(false);
        JScrollPane seqScroller = new JScrollPane(seqArea);
        seqScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        seqScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        seqPanel.add(seqScroller, BorderLayout.WEST);
        parseFile();
        frame.add(seqPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
        }
        private void parseFile() {
            // function to simulate string that would be parsed from file.
            sequences = new LinkedHashMap<>();
            StringBuilder seq1 = new StringBuilder();
            StringBuilder seq2 = new StringBuilder();
            String[] bases = {"A", "C", "T", "G"};
            for (int i=0; i < 400000; i++) {
                int index1 = (int) Math.floor(Math.random() * 3);
                int index2 = (int) Math.floor(Math.random() * 3);
                seq1.append(bases[index1]);
                seq2.append(bases[index2]);
            }
            sequences.put("seq1", seq1.toString());
            sequences.put("seq2", seq2.toString());
            setList(sequences);
        }
        private void setList(Map<String, String> sequences) {
            stringArr = sequences.keySet().toArray(new String[0]);
            idList.setListData(stringArr);
        }
        public class SeqListSelectionListener implements ListSelectionListener {
        @Override
        public void valueChanged(ListSelectionEvent le) {
            if (!le.getValueIsAdjusting()) {
                String chosenSeq = idList.getSelectedValue();
                String sequence = sequences.get(chosenSeq);
                seqArea.setText("");
                seqArea.setText(sequence);
            }
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GUI().init());
    }

}



【问题讨论】:

  • 您使用的是哪个 Java 发行版/版本?由于这看起来像一个错误,我建议确保它在最新版本上可重现,如果是,则将其提交给他们的错误跟踪器。
  • 我可以确认 Java 17 中存在这种行为。
  • JComponentJTextArea 的基类,具有有限的大小。如果您尝试放置的字符数超出组件所能容纳的数量,则会得到不可预知的结果。
  • 经过测试的代码为我的 Windows 机器上的 2 个测试用例产生了良好的结果。使用 Java 15 和 Java 17 测试。
  • @camickr 是的,你是对的,我现在已经添加了答案。

标签: java string swing user-interface jtextarea


【解决方案1】:

据报道,此问题是 Linux 环境中的常见错误 (https://bugs.openjdk.java.net/browse/JDK-8262010)。

我通过使用解决了这个问题

-Dsun.java2d.xrender=false

运行程序时的 Java VM 选项,关闭基于 XRender 的 Java 2D 渲染管道。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2013-07-06
    • 2010-10-17
    • 2015-05-27
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多