我正在尝试从JList
方法中填充Arraylist<Member>
中的ActionListener
。
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!");
}
}
};
结果是我正在尝试填充ArrayList<Member>
的{{1}},以创建一个用户可以在JList
中的对象之间进行选择的界面。
此外:
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)
我认为问题源于我在 public void valueChanged(ListSelectionEvent e){
}
之外声明JList
和JScrollPane
,然后无法填充actionlistener
。 JList
方法没有完全完成(我必须先解决这个问题),但我不相信这个问题源于它是空的。
从valueChanged
外部填充JList
将无效,因为ActionListener
尚未填写。我们的想法是您搜索id或familyName或两者,并根据SQLite数据库的匹配获得许多选择。结果ArrayList
的内容是基于DB匹配的对象。
我相信这可能是一个真正的新手错误,但我很感激我能得到的任何帮助。
我收到的消息:
答案 0 :(得分:2)
首先,-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();
然后将这些添加到UI ...
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);
//...
}
};
答案 1 :(得分:1)
我认为这只是因为JList是泛型类型,并且您尝试将其用作原始类型。
http://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html
请注意,这些只是警告,而不是错误
如果您说JList<Member>
,这些警告可能会消失。