2015-10-05 150 views
2

我想知道是否有办法通过选择带JList的项目来让程序执行一些代码。每次选择新项目时,都应运行此代码。JList项目选择

以前,我添加了一个监听器。这是我做的一个最简单的例子。

public class Driver { 

    public static void main(String[] args) { 
     JFrame frame = new ListFrame(); 
     frame.setVisible(true); 
     frame.setSize(200,100); 
    } 

} 

public class ListFrame extends JFrame { 

    private JList<String> list; 
    private JScrollPane scrollPane; 
    private String[] data = {"A","B","C"}; 
    private JButton addButton = new JButton("Add"); 

    public ListFrame() { 
     setLayout(new BorderLayout()); 

     list = new JList<String>(data); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     scrollPane = new JScrollPane(list); 

     add(scrollPane, BorderLayout.CENTER); 
     add(addButton, BorderLayout.SOUTH); 

     addButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       String newEntry = JOptionPane.showInputDialog("Add new entry."); 
       String[] tempData = new String[data.length + 1]; 
       for(int i = 0; i < data.length; i++) 
        tempData[i] = data[i]; 
       tempData[data.length] = newEntry; 
       data = tempData; 
       list = new JList<String>(data); 
       scrollPane.setViewportView(list); 
      } 

     }); 

     list.addListSelectionListener(
       new ListSelectionListener() { 

        @Override 
        public void valueChanged(ListSelectionEvent e) { 
         System.out.println("Hi"); 
        } 

     }); 
    } 
} 

但是,当我单击Jlist上的项目时,什么都不打印。

+1

Google it buddy。您将获得大量链接 –

+2

请参见[如何编写列表选择监听器](http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html)和[如何使用列表](http: //docs.oracle.com/javase/tutorial/uiswing/components/list.html)以获取更多详细信息 – MadProgrammer

+0

我已经使用其他信息更新了我的问题。我已经尝试了列表选择监听器。 – Halbort

回答

3

您的示例使用getSelectionModel()来获取列表ListSelectionModel,它将您的侦听器直接添加到选择模型。这绕过ListSelectionHandler,内部使用JList,这是从来没有机会fireSelectionValueChanged()。相反,让JList添加您的听众:

list.addListSelectionListener(new ListSelectionListener() {...} 

当我点击JList一个项目,没有打印。

您的新示例打印“嗨”当我点击一个项目,但我看到了一些问题:

  • 一定要在event dispatch thread运行。

  • 查看ListSelectionEvent了解发生了什么的细节。

  • 要添加元素到列表中,请不要创建新的JList;改为更新列表的ListModel

How to Write a List Selection Listener更多;这是我测试的例子。

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class Driver { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      JFrame frame = new ListFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setVisible(true); 
     }); 
    } 

    private static class ListFrame extends JFrame { 

     private final String[] data = {"A", "B", "C"}; 
     private final DefaultListModel model = new DefaultListModel(); 
     private final JList<String> list = new JList<>(model); 
     private final JButton addButton = new JButton("Add"); 

     public ListFrame() { 
      for (String s : data) { 
       model.addElement(s); 
      } 
      list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      add(new JScrollPane(list), BorderLayout.CENTER); 
      add(addButton, BorderLayout.SOUTH); 
      addButton.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        String newEntry = JOptionPane.showInputDialog("Add new entry."); 
        model.addElement(newEntry); 
       } 
      }); 
      list.addListSelectionListener(new ListSelectionListener() { 

       @Override 
       public void valueChanged(ListSelectionEvent e) { 
        if (!e.getValueIsAdjusting()) { 
         System.out.println(e.getFirstIndex() + " " + e.getLastIndex()); 
        } 
       } 
      }); 
     } 
    } 
} 
+0

我已经添加了一个最小的例子。你能再看一遍这个问题吗? – Halbort

+1

非常感谢。对不起,我花了这么长时间回应。 – Halbort