2009-11-26 10 views
0

Je crée une interface graphique de carnet d'adresses avec Java et j'ai un JList qui affiche tous les noms des personnes dans mon ArrayList (ceci est rempli par la méthode updateinfo mentionnée ci-dessous). Je le veux donc quand je clique sur un article sur le JList, les TextField s sont ensuite mis à jour avec les détails de cette personne. Avant j'ai seulement utilisé des boutons et donc actionListeners. Je pense que je comprends qu'un JList doit utiliser ListSelectionListener mais je ne peux pas sembler l'implémenter. J'ai ajouté un extrait de mon code ci-dessous. Quelqu'un peut-il aider? Pour assurer la continuité avec mon actionlisteners je voudrais avoir comme une classe interne, mais ce n'est pas indispensableJava - mise à jour textFields de JList

JList jl; 
DefaultListModel list; 

list = new DefaultListModel(); 
this.jl = new JList(this.list); 
//add ListSelectionListener???? 
updateList(); 
this.add(this.jl, layout); 

Répondre

0

Vous venez d'ajouter à la sélection auditeur à la liste, comme ça:

jl.addSelectionListener(new ListSelectionListener() { 

    public void valueChanged(ListSelectionEvent e) { 
    // evaluate e if necessary and call a method 
    // in your class to write the text in the textfield 
    int selectedRow = e.getFirstIndex(); // more complicate for multiselects 
    updateTextFieldWithName(selectedRow); // to be implemented 
    } 
}); 

L'utilisation d'un anonyme classe comme ici est le moyen le plus rapide. C'est un peu difficile à lire mais un motif typique.

(vous lire préféré une classe interne, mais je ne peux pas le code qui ici à la volée sans IDE à portée de main ...)

0

Oui, vous voudrez utiliser un ListSelectionListener pour cela, vous aussi probablement vouloir mettre la liste à la sélection unique (ListSelectionModel.SINGLE_SELECTION). Cela permettra à l'utilisateur de sélectionner uniquement un élément de la liste. Vous pouvez alors ajouter listSelectionListener, et dans la valeur valueChanged de l'événement faire quelque chose comme suit (syntaxe pas exacte).

valueChanged(ListSelectionEvent e){ 
    int idx = e.getFirstIndex(); 
    int idx2 = e.getLastIndex(); //idx and idx2 should be the same if you set SingleSel 
    if(idx==idx2){ 
    //here you can get the person detail however you have them stored. You can get them from the model like so, 
     Object personObj = MYLIST.getModel().getElementAt(int index); 
    } 


} 
1

Vous pouvez ajouter l'écouteur, puis interroger uniquement l'index actuellement sélectionné.

J'ai fait un échantillon pour vous, j'espère que vous le trouverez utile.

Ceci est la section pertinente:

private JComponent list() { 
     final JList list = new JList(data); 
     list.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
      int i = list.getSelectedIndex(); 
      nameTextField.setText(i >= 0 ? data.get(i) : ""); 
      } 
     }); 
     return new JScrollPane(list); 
    } 

Gardez à l'esprit que ce n'est pas la seule façon d'aller, c'est juste un point de départ pour vous.

voici l'exemple de travail complet:

import java.util.Vector; 
import java.util.Arrays; 

import java.awt.BorderLayout; 

import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JLabel; 
import javax.swing.JComponent; 

import javax.swing.event.ListSelectionListener; 
import javax.swing.event.ListSelectionEvent; 

public class JListSample { 

    private Vector<String> data = new Vector<String>( 
      Arrays.asList(new String [] { 
        "one", "two", "three" 
      }) 
    ); 

    private JTextField nameTextField; 

    public static void main(String [] args) { 
     JListSample s = new JListSample(); 
     s.run(); 
    } 
    public void run() { 
     JFrame frame = new JFrame("Selection test"); 
     frame.add(list(), BorderLayout.WEST); 
     frame.add(editPanel()); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    private JComponent list() { 
     final JList list = new JList(data); 
     list.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
      int i = list.getSelectedIndex(); 
      nameTextField.setText(i >= 0 ? data.get(i) : ""); 
      } 
     }); 
     return new JScrollPane(list); 
    } 
    private JComponent editPanel() { 
     JPanel panel = new JPanel(); 
     panel.add( new JLabel("Name:")); 
     nameTextField = new JTextField(10); 
     panel.add(nameTextField); 
     return panel; 
    } 
} 

Voici ce qui est affiché:

sample http://img177.imageshack.us/img177/6294/capturadepantalla200911k.png

0

Je crois comprendre qu'un JList doit utiliser ListSelectionListener mais je ne peux pas sembler pour implémenter ceci

Eh bien, commencez par lire l'API JList. Vous trouverez un lien vers le tutoriel Swing sur "Comment utiliser les listes", qui contient un exemple pratique.

Dans le tutoriel, vous trouverez également une section sur "Comment écrire un List List Listener" qui contient un second exemple.

Commencez par le didacticiel pour vos questions de base.

Questions connexes