6

私は Swing を使用しようと試みており、オブジェクトの配列リストと組み合わせて JList を使用することに集中することにしました。

ボタンを押すと配列リストの内容が表示される空の JList を表示するプログラムを作成したいと思いました。

私の現在のコードは上記のすべてを実行しますが、JList の単一のエントリをクリックすると、それが 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

}
4

2 に答える 2

6

簡単な答え: 次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 JavadocsおよびListSelectionModel Javadocs

于 2012-04-10T23:15:37.533 に答える
3

コードをテストしました。項目選択時 2 イベントが送信されます。私が見ることができる唯一の違いは isAdjusting ブール値です。これは 1 回目は true に設定され、2 回目は false に設定されます

とにかく、これは標準的な動作のようです

于 2012-04-10T23:06:34.990 に答える