2015-10-05 190 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