2014-03-24 91 views
0

我试图从ActionListener方法中从Arraylist<Member>填充JList使用ArrayList从actionlistener中填充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对象之间选择ArrayList<Member>

此外:

  ... 
      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){ 
     } 

我相信从我宣布actionlistenerJListJScrollPane再不能填充JList事实的问题造成的。 valueChanged方法还没有完全完成(我必须先解决这个问题),但我不认为这个问题是由于它是空的。

ActionListener以外填充JList将不起作用,因为ArrayList尚未填充。这个想法是,你要搜索一个id或一个familyName或两者,并根据来自SQLite数据库的匹配得到一些选择。结果ArrayList的内容是基于来自数据库的匹配的对象。

我相信这可能是一些真正的菜鸟错误,但我将不胜感激任何帮助。

的消息,我得到: enter image description here

+0

你用什么来编译程序?它不应该有任何区别 – MadProgrammer

+0

最新的java版本 – Flowdorio

+0

是的,我刚刚测试了这个,'-Xlint'标志提供了关于缺乏泛型的警告。这意味着编译器无法保证'JList'所期望的数据实际上是您提供的数据。也就是说,你设置它的方式,'JList'需要'Object'类型的元素,但是你正在提供'Memeber'。这不是问题,只要你确保你的渲染器可以处理这个问题。这只是编译器告诉你,它没有办法确定这是否是正确的行为... – MadProgrammer

回答

1

我认为这仅仅是因为JList的是一个通用型,并尝试使用它作为原始类型。

http://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html

注意,这仅仅是警告,而不是错误。
如果你说JList<Member>,这些警告可能会消失。

+0

因此,在类的开始声明它为“private”之后,我在actionlistener中有JList和ScrollPane的事实是没有问题? 现在打开你的链接,将一些知识打进这个厚厚的头部。 – Flowdorio

+0

也许你需要阅读一些关于泛型类型和原始类型的信息。看到我的第一个链接。注意这个'Class JList ' - 这个''表示它是一个通用类型。 –

+0

http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html –

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); 
     //... 
    } 
}; 
+0

多谢这有助于 – Flowdorio

+0

只有一个问题:?!。 现在,我得到了与Object类型的列表 我仍然希望能够使用Arr的每个不同属性我以前制作的对象是。有没有一种方法可以将它转换为ArrayList ,并且具有与从getMembersForList方法获得的ArrayList相同的属性? – Flowdorio

+0

如果我正确理解您的问题,请查看[如何使用列表](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html),并密切关注[编写自定义Cell Renderer](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer)。这将允许您定义显示在'JList'中的对象的属性 – MadProgrammer