2015-10-05 1 views
2

Je me demandais s'il y avait un moyen, en sélectionnant un élément avec un JList, de laisser le programme exécuter du code. Ce code doit être exécuté chaque fois qu'un nouvel élément est sélectionné.Sélection d'élément JList

Auparavant, j'avais ajouté un écouteur. Voici un exemple minimal que j'ai fait.

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"); 
        } 

     }); 
    } 
} 

Cependant, lorsque je clique sur un élément de la liste J, rien n'est imprimé.

+1

Google il mon pote. Vous obtiendrez des tonnes de liens –

+2

Voir [Comment écrire un List List Listener] (http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html) et [Comment utiliser les listes] (http: //docs.oracle.com/javase/tutorial/uiswing/components/list.html) pour plus de détails – MadProgrammer

+0

J'ai mis à jour ma question avec des informations supplémentaires. J'ai déjà essayé l'écouteur de sélection de liste. – Halbort

Répondre

3

Votre exemple utilise getSelectionModel() pour obtenir le ListSelectionModel de la liste, et il ajoute votre auditeur directement au modèle de sélection. Cela contourne le ListSelectionHandler, utilisé en interne par JList, qui n'a jamais une chance de fireSelectionValueChanged(). Au lieu de cela, nous allons JList ajouter votre auditeur:

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

lorsque je clique sur un élément de la JList, rien est imprimé.

Votre nouvel exemple imprime « Salut » lorsque je clique sur un élément, mais je vois quelques problèmes:

  • Assurez-vous de courir sur le event dispatch thread.

  • Vérifiez le ListSelectionEvent pour plus de détails sur ce qui s'est passé. Pour ajouter des éléments à la liste, ne créez pas un nouveau JList; mettre à jour la liste ListModel à la place.

Voir How to Write a List Selection Listener pour plus; voici l'exemple que j'ai testé.

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

J'ai ajouté un exemple minimal. Pourriez-vous revoir la question? – Halbort

+1

Merci beaucoup. Désolé, j'ai pris tant de temps pour répondre. – Halbort