gpt4 book ai didi

java - JList 复制选择

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:23 25 4
gpt4 key购买 nike

我正在尝试使用 Swing,并决定专注于将 JList 与对象数组列表结合使用。

我想创建一个显示空白 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

}

最佳答案

简短的回答:像这样在打印周围添加 if (!event.getValueIsAdjusting()):

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

长答案:正在触发两个事件。一个在单击鼠标时触发,另一个在松开鼠标时触发。我们通常认为单击是一个单一的 Action ,但实际上它是由鼠标按下、任何移动和鼠标释放组成的。在这些阶段中,选择的内容可能会发生变化。运行您的代码并尝试单击一行,拖动到其他行,然后释放。每次行更改时,您都会看到事件被触发。通过仅在值不再调整时采取行动,您可以触发“最终”状态。

来源:ListSelectionEvent JavadocsListSelectionModel Javadocs

关于java - JList 复制选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com