繁体   English   中英

JList重新填充非常慢

[英]Very slow JList repopulation

我有一个JList组件,应该将其清空并重新填充。 以下代码(基于我的原始代码)显示了一个带有JList和JButton的简单窗口:

import java.awt.BorderLayout;
import javax.swing.*;

public class JListTest extends javax.swing.JFrame{
    JList jList;
    JButton button;
    DefaultListModel model;

    public JListTest() {
        jList = new JList();
        model = new DefaultListModel();
        jList.setModel( model );
        button = new JButton();

        getContentPane().add(jList, java.awt.BorderLayout.CENTER);

        button.setText("add 10000 items");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                model.clear();
                for( int i=0; i<10000; ++i ) {
                    model.addElement( "aaaa");
                }
            }
        });
        getContentPane().add(button, BorderLayout.PAGE_START);        
        pack();        
    }

    public static void main(String args[]) {
        JListTest jlt =new JListTest();
        jlt.setSize(300, 300);
        jlt.setVisible( true );
    }
}

如果按下按钮,插入(10000个项目)非常快。 如果我一次又一次地按它,它仍然非常快。

如果我选择第三项并按下按钮,则结果相同,插入速度非常快。

如果我选择第一项并按下按钮,程序将变得非常慢(实际上我必须停止它)。

为什么选择第一项会减慢执行速度?

我已经使用JDK 1.5和1.6对其进行了测试。

我建议编写自己的模型,该模型允许一次添加一堆值。 我猜这不是对模型的补充,而是由此触发的GUI问题会影响性能。

我不确定为什么选择一个项目会导致性能问题。 但是,每当您添加一个项目时,都会触发一个事件,告诉该列表重新绘制其元素。 因此,选择一个项目这一事实可能会导致额外的粉刷。

无论如何,更好的方法是创建一个新模型,然后将其添加到列表中:

    button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            DefaultListModel dlm = new DefaultListModel();
            for( int i=0; i<10000; ++i ) {
                dlm.addElement( "aaaa");
            }
            jList.setModel(dlm);
        }
    });

这样,不会在添加每个新项目时触发事件。

您不应该在这样的事件循环中向模型添加大量元素。 最好是让您的动作侦听器产生一个线程来添加项目,并让该线程调用SwingUtilities.invokeLater()以将change事件激发到列表中。

请注意,按照下面的注释,您需要创建一个AbstractListModel(或它的子类)并使其成为模型,然后在invokeLater中对其调用fireContentsChanged

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM