2012-04-10 10 views
4

Ich versuche, meine Hand auf Schwingen mit und entschied über die Verwendung JList in Verbindung mit einem Arraylist mit Objekten zu konzentrieren.JList Auswahl duplizieren

Ich wollte ein Programm erstellen, das eine leere JList zeigte, die, wenn eine Taste gedrückt wurde, den Inhalt der Arraylist anzeigen würde und eine einzelne Auswahl ermöglichen würde, die das, was auch immer ausgewählt wurde, auszudrucken.

Mein aktueller Code tut all die jedoch oben, wenn ich auf dem JList auf einen einzigen Eintrag klicken sie es zweimal drucken. Ich habe das Gefühl, dass dies ein einfacher Fehler ist, der leicht behoben werden kann, aber ich habe gelesen und mein Gehirn hat aufgehört zu kooperieren.

Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus :)

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import javax.swing.event.*; 


public class textarea { 

    ArrayList <Pet> petList = new ArrayList <Pet>(); 
    DefaultListModel model = new DefaultListModel(); 
    JList list = new JList(); 

    public static void main (String [] args){ 

     textarea gui = new textarea(); 
     gui.go(); 
    } 

    public void go(){ 

     petList.add(new Pet("Lucy","Dog",5)); 
     petList.add(new Pet("Geoff","Cat",2)); 
     petList.add(new Pet("Hammond","Hamster",1)); 

     model = new DefaultListModel(); 
     for(Pet p:petList){ 
      model.addElement(p.toString()); 
     } 

     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     JButton button = new JButton("view pets"); 
     button.addActionListener(new ButtonListener()); 


     JScrollPane scroller = new JScrollPane(list); 
     scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

     panel.add(scroller); 

     list.setVisibleRowCount(4); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     list.addListSelectionListener(new ListSelectionListener(){ 
      public void valueChanged(ListSelectionEvent event){ 
       String selection = (String) list.getSelectedValue(); 
       System.out.println(selection); 
      } 
     }); 

     frame.getContentPane().add(BorderLayout.CENTER,panel); 
     frame.getContentPane().add(BorderLayout.SOUTH,button); 

     frame.setSize(350,300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    }//end go() 

     class ButtonListener implements ActionListener{ 
     public void actionPerformed(ActionEvent event){ 
       list.setModel(model); 
      } 
     }//end ButtonListener 

} 
+0

Allgemeine Anmerkung: Sie sollten GUI-Code in der [EDT] laufen (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) mit ' SwingUtilities.invokeLater() '. – assylias

+0

Danke, ich werde es behalten und den Code entsprechend ändern. – skon

Antwort

4

Kurze Antwort ist: wie so hinzufügen if (!event.getValueIsAdjusting()) um den Druck:

list.addListSelectionListener(new ListSelectionListener() 
{ 
    public void valueChanged(ListSelectionEvent event) 
    { 
    if (!event.getValueIsAdjusting()) 
    { 
     String selection = (String) list.getSelectedValue(); 
     System.out.println(selection); 
    } 
    } 
}); 

Lange Antwort: Zwei Ereignisse werden ausgelöst. Einer wird ausgelöst, wenn die Maus angeklickt wird, und ein anderer löst aus, wenn die Maustaste losgelassen wird. Normalerweise denken wir an einen Klick als eine einzige Aktion, aber in Wirklichkeit besteht er aus der Mausdepression, den Bewegungen und der Freigabe der Maus. Während dieser Phasen kann sich der Inhalt der Auswahl ändern. Führen Sie Ihren Code aus und versuchen Sie, auf eine Zeile zu klicken, in andere Zeilen zu ziehen und die Maustaste loszulassen. Sie sehen Ereignisse, die jedes Mal ausgelöst werden, wenn sich die Zeile ändert. Wenn Sie nur Maßnahmen ergreifen, wenn sich der Wert nicht mehr anpasst, können Sie auf den Status "final" (endgültig) schießen.

Quelle: ListSelectionEvent Javadocs und ListSelectionModel Javadocs

+0

Danke Eric. Event-Handling macht jetzt mehr Sinn, nachdem Sie getan haben, was Sie erwähnt haben. – skon

+0

Ich bin froh zu hören, dass es hilfreich war. Willkommen bei Stack Overflow! –

2

Nur Ihren Code getestet. Bei der Artikelauswahl werden 2 Ereignisse gesendet. Der einzige Unterschied, den ich sehen kann, ist mit dem isAdjusting boolean. Dies wird auf true gesetzt, das erste Mal, falsch die zweite

Wie dem auch sei, so scheint es, dass dieses Standardverhalten