2012-04-10 9 views
4

私はSwingを使用しています。オブジェクトのarraylistと一緒にJListを使用することに専念することに決めました。JListの複製の選択

ボタンを押すとarraylistの内容が表示され、選択されたものを印刷する単一の選択を許可する空のJListを表示するプログラムを作成したかったのです。

私の現在のコードは上記のすべてですが、JList上の1つのエントリをクリックすると2回出力されます。私はこれが簡単に間違っているように感じますが、私はそれを読んでいて、私の脳は協力しなくなりました。

ご協力いただきますようお願い申し上げます。事前に感謝:)

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

一般的なコメント:あなたは '使用して、[EDT](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)でGUIコードを実行する必要がありますSwingUtilities.invokeLater() ' – assylias

+0

ありがとう、私はそれを心に留めて、それに応じてコードを変更します。 – skon

答えて

4

短い答え:そうのようなあなたの印刷の周りif (!event.getValueIsAdjusting())を追加します。

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

長い答え: 2つのイベントが発生しています。マウスがクリックされると1つが起動し、もう1つが起動すると起動します。通常は、クリックを単一のアクションと見なしますが、実際には、マウスの押し下げ、あらゆる動き、マウスのリリースで構成されます。これらのフェーズでは、選択内容が変更される可能性があります。コードを実行して行をクリックし、他の行にドラッグして解放します。行が変わるたびにイベントが発生することがわかります。値が調整されなくなったときにのみアクションを実行することで、「最終的な」状態で起動することができます。

出典:ListSelectionEvent JavadocsListSelectionModel Javadocs

+0

ありがとうエリック。イベント処理は、あなたが言及したことをした後、今より意味があります。 – skon

+0

私はそれが役に立つと聞いてうれしいです。スタックオーバーフローへようこそ! –

2

ちょうどあなたのコードをテストしました。項目選択時に2つのイベントが送信されます。私が見ることのできる唯一の違いはisAdjustingブール値です。これは、とにかく二

、偽trueに最初に設定され、標準的な動作であると思わ

関連する問題