[英]Populating JList from inside actionlistener with arraylist
我正在尝试从ActionListener
方法内部的Arraylist<Member>
填充JList
。
public class guiDemo extends JFrame implements ListSelectionListener {
...
private JList list = new JList();
private JScrollPane sp = new JScrollPane();
...
ActionListener list10 = new ActionListener() {
public void actionPerformed(ActionEvent e) {
win5.setVisible(true);
p1.setVisible(false);
String familyName = null;
int id = 0;
try {
familyName = (txt4.getText());
id = Integer.parseInt(txt3.getText());
} catch (NumberFormatException ne) {
System.out.println("error");
id = 0;
}
try{
ArrayList<Member> result = getMembersForList(id, familyName);
list = new JList(result.toArray());
sp = new JScrollPane(list);
} catch (SQLException se) {
txt.setText("SQLException!");
}
catch ( ClassNotFoundException ce) {
txt.setText("ClassNotFoundException!");
}
}
};
结果是我要用来填充JList
的ArrayList<Member>
,以创建一个接口,用户可以在其中选择ArrayList
的对象。
此外:
...
b14.addActionListener(list10);
...
win5.setPreferredSize(new Dimension(400, 400));
win5.setLayout(new GridLayout(10,1));
win5.setMinimumSize(new Dimension(400, 400));
win5.add(b13);win5.add(l9);win5.add(txt3);win5.add(l10);
win5.add(txt4);win5.add(b14);win5.add(l11);
win5.add(sp);
list.setVisibleRowCount(15);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addListSelectionListener(this);
...
如您所见, JList
将位于两个textfields(txtX)
, labels(lX)
和buttons (bX)
labels(lX)
下方。
public void valueChanged(ListSelectionEvent e){
}
我相信从我宣布一个事实问题茎JList
与JScrollPane
外面actionlistener
,然后无法填充JList
。 valueChanged
方法尚未完全完成(我必须先解决此问题),但我不认为此问题源于它为空的事实。
由于尚未填充ArrayList
因此无法从ActionListener
外部填充JList
。 这个想法是您搜索ID或FamilyName或两者都搜索,并根据来自SQLite数据库的匹配项获得许多选择。 结果ArrayList
的内容是基于数据库中匹配项的对象。
我相信这可能是一些真正的菜鸟错误,但是我将不胜感激。
我收到的消息是:
首先, -Xlint
标志提供有关缺少泛型的警告。
这意味着编译器不能保证JList
期望的数据实际上是您提供的数据。 也就是说, JList
设置方式期望的是Object类型的元素,但您提供的是Memeber
。
只要您确保渲染器可以实际处理此问题,这就不成问题。 只是编译器告诉您,它无法确保此行为正确与否……这可能会在运行时引起问题。
最好在可能的情况下使用tp提供对泛型的支持,但并非总是可能的。
private JList<Member> list ...;
//...
ArrayList<Member> result = getMembersForList(id, familyName);
list = new JList(result.toArray(new Member[result.size()]));
这将允许您在编译时捕获可能的错误,而不是在运行时遇到错误...
其次,让我猜测一下...
您创建JList
和JScrollPane
的实例。
private JList list = new JList();
private JScrollPane sp = new JScrollPane();
然后将它们添加到用户界面...
sp.setViewportView(list);
add(sp); // for example...
然后在actionPerformed
方法中,创建这些对象的新实例。
list = new JList(result.toArray());
sp = new JScrollPane(list);
但是千万不要将它们添加到UI中,有些人会多么神奇地期望他们知道如何链接到以前的实例并更新UI ...?
那不是它的工作原理。 您在actionPerformed
方法中创建的实例与先前创建的对象没有关系。 相反,您应该更改JList
的模型,例如...
ActionListener list10 = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//...
try{
//ArrayList<Member> result = getMembersForList(id, familyName);
//list = new JList(result.toArray());
//sp = new JScrollPane(list);
DefaultListModel model = new DefaultListModel();
for (Member member : getMembersForList(id, familyName)) {
model.addElement(member);
}
list.setModel(model);
//...
}
};
我认为这仅仅是因为JList是泛型类型,并且您尝试将其用作原始类型。
http://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html
请注意,这些只是警告,并非错误。
如果您说JList<Member>
,这些警告可能会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.