首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultListModel.clear错误

DefaultListModel.clear错误
EN

Stack Overflow用户
提问于 2011-03-05 06:43:27
回答 2查看 1.2K关注 0票数 0

我正在尝试显示一个项目列表,当用户单击一个项目时,清除该列表并显示另一个列表。

如果我运行此程序并单击显示列表中的第一个条目,程序将终止,并出现一长串运行时异常。如果我删除clear()行(下面注释),它运行得很好。添加try/catch并没有透露任何对我有用的信息。很抱歉代码太长了,但我不知道如何缩短代码并仍然生成错误。

我哪里做错了?

代码语言:javascript
复制
import java.util.*;

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

class ListGui extends JPanel implements ListSelectionListener {

    private static JList list;
    private static DefaultListModel listModel = new DefaultListModel();

    public ListGui() {
        super(new BorderLayout());
        list = new JList(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addListSelectionListener(this);
        JScrollPane listScrollPane = new JScrollPane(list);
        add(listScrollPane, BorderLayout.CENTER);
    }

    public static void Populate(List<String> lines) {
        listModel.clear();
        for(String line : lines) {
            listModel.addElement(line);
        }
    }

    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting() == false) {
            List<String> out = new ArrayList<String>();
            out.add("three");
            out.add("four");
            Populate(out);
        }
    } 
}

public class TestClear {

    static JComponent newContentPane = new ListGui();

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("toast");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) { 

        List<String> out = new ArrayList<String>();

        createAndShowGUI();

        out.add("one");
        out.add("two");
        ListGui.Populate(out);               
    }
}
EN

回答 2

Stack Overflow用户

发布于 2011-03-05 07:06:24

我正在尝试显示一个项目列表,当用户单击一个项目时,清除该列表并显示另一个列表。

在我看来,这不是最好的设计。每当您单击某个项目或使用箭头键在列表中上下移动时,选择都会发生变化。我敢肯定,对于喜欢使用键盘的用户,您不希望每次使用箭头键时列表都会发生变化。

通常的设计是在“双击”或用户从键盘上“回车”时调用列表上的操作。使用List Action概念很容易实现这一点。

但是,如果您确实想要更新每个选择的列表,那么我将使用如下代码:

代码语言:javascript
复制
list.removeListSelectionListener( this );
populate(...);
list.addListSelectionListener(this); 
票数 3
EN

Stack Overflow用户

发布于 2011-03-05 06:50:44

问题是,您在valueChanged()中调用Populate(),这会触发valueChanged(),从而导致堆栈溢出。

最简单的解决方案是设置一个标志来防止重新进入。

代码语言:javascript
复制
 boolean busy = false;
    public void valueChanged(ListSelectionEvent e) {

        if (e.getValueIsAdjusting() == false && !busy) {
            busy = true;
            List<String> out = new ArrayList<String>();
            out.add("three");
            out.add("four");
            Populate(out);
            busy = false;
        }
    } 

如果您的代码可以被多个线程访问,那么您应该考虑ReentrantLock

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5200096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档