我正在尝试显示一个项目列表,当用户单击一个项目时,清除该列表并显示另一个列表。
如果我运行此程序并单击显示列表中的第一个条目,程序将终止,并出现一长串运行时异常。如果我删除clear()行(下面注释),它运行得很好。添加try/catch并没有透露任何对我有用的信息。很抱歉代码太长了,但我不知道如何缩短代码并仍然生成错误。
我哪里做错了?
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);
}
}发布于 2011-03-05 07:06:24
我正在尝试显示一个项目列表,当用户单击一个项目时,清除该列表并显示另一个列表。
在我看来,这不是最好的设计。每当您单击某个项目或使用箭头键在列表中上下移动时,选择都会发生变化。我敢肯定,对于喜欢使用键盘的用户,您不希望每次使用箭头键时列表都会发生变化。
通常的设计是在“双击”或用户从键盘上“回车”时调用列表上的操作。使用List Action概念很容易实现这一点。
但是,如果您确实想要更新每个选择的列表,那么我将使用如下代码:
list.removeListSelectionListener( this );
populate(...);
list.addListSelectionListener(this); 发布于 2011-03-05 06:50:44
问题是,您在valueChanged()中调用Populate(),这会触发valueChanged(),从而导致堆栈溢出。
最简单的解决方案是设置一个标志来防止重新进入。
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
https://stackoverflow.com/questions/5200096
复制相似问题