JList重复选择

sko*_*kon 6 java swing arraylist jlist

我正在尝试使用Swing,并决定专注于将JList与Objects的arraylist结合使用.

我想创建一个显示空白JList的程序,当按下按钮时,它会显示arraylist的内容,并允许单个选择打印出所选的内容.

我当前的代码完成了上述所有操作,但是当我单击JList上的单个条目时,它会将其打印两次.我觉得这是一个简单的错误,很容易纠正,但我一直在阅读它,我的大脑已停止合作.

任何帮助将不胜感激.提前致谢 :)

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

}
Run Code Online (Sandbox Code Playgroud)

Eri*_*zke 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);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

答案很长:有两件事被解雇.单击鼠标时会触发一个,而释放鼠标时会触发另一个.我们通常将点击视为单个动作,但实际上它是由鼠标凹陷,任何动作和鼠标释放组成的.在这些阶段期间,选择的内容可以改变.运行代码并尝试单击一行,拖动到其他行,然后释放.每次行更改时,您都会看到事件被触发.通过仅在值不再调整时执行操作,您可以触发"最终"状态.

来源:ListSelectionEvent JavadocsListSelectionModel Javadocs