我正在尝试使用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
}
答案 0 :(得分: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);
}
}
});
答案很长:有两件事正在被解雇。单击鼠标时会触发一个,而释放鼠标时会触发另一个。我们通常将点击视为单个动作,但实际上它是由鼠标凹陷,任何动作和鼠标释放组成的。在这些阶段期间,选择的内容可以改变。运行代码并尝试单击一行,拖动到其他行,然后释放。每次行更改时,您都会看到事件被触发。通过仅在值不再调整时采取行动,您可以触发“最终”状态。
答案 1 :(得分:3)
刚刚测试过您的代码。在项目选择上发送2个事件。我能看到的唯一区别是isAdjusting布尔值。第一次设置为true,第二次设置为false
无论如何,这似乎是标准行为