繁体   English   中英

使用arraylist从actionlistener内部填充JList

[英]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!");     
        }
    }
};

结果是我要用来填充JListArrayList<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){
        }

我相信从我宣布一个事实问题茎JListJScrollPane外面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()]));

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

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

您创建JListJScrollPane的实例。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM