使用arraylist从actionlistener内部填充JList

时间:2014-03-24 21:46:16

标签: java swing arraylist jlist

我正在尝试从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); ... 位于两个JListtextfields(txtX)labels(lX)之下。

buttons (bX)

我认为问题源于我在 public void valueChanged(ListSelectionEvent e){ } 之外声明JListJScrollPane,然后无法填充actionlistenerJList方法没有完全完成(我必须先解决这个问题),但我不相信这个问题源于它是空的。

valueChanged外部填充JList将无效,因为ActionListener尚未填写。我们的想法是您搜索id或familyName或两者,并根据SQLite数据库的匹配获得许多选择。结果ArrayList的内容是基于DB匹配的对象。

我相信这可能是一个真正的新手错误,但我很感激我能得到的任何帮助。

我收到的消息: enter image description here

2 个答案:

答案 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()]));

这将允许您在编译时捕获可能的错误,而不是在运行时遇到错误...

其次,让我猜一下......

您创建了JListJScrollPane ...

的实例
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>,这些警告可能会消失。