我不确定为什么所有内容都打印两次。例如,如果您按“Male”,则程序将打印 MaleMale。这是一个更大程序的一部分:我想要性别(一个字符串)来存储最后的选择。这段代码是这样做的吗?
DefaultListModel toAdd = new DefaultListModel();
toAdd.addElement("Male");
toAdd.addElement("Female");
toAdd.addElement("Others");
JList list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setBorder(new TitledBorder(null, "How do you identify yourself?", `
TitledBorder.CENTER, TitledBorder.TOP, null, null));
list.setBackground(SystemColor.info);
list.setBounds(57, 85, 244, 97);
list.setModel(toAdd);
frame.getContentPane().add(list);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged (ListSelectionEvent event) {
int lastSelIx = list.getMaxSelectionIndex();
gender = (String) list.getModel().getElementAt(lastSelIx);
System.out.print(gender);
}
);
}
最佳答案
一般来说,ListSelectionListener
会生成两个事件,一个用于“取消选择”当前选定的项目/范围,另一个用于“选择”新的项目/范围。
如果您只对已选择的内容感兴趣,则可以使用 ListSelectionEvent#getValueIsAdjusting
,如果有更多事件即将发生,它将返回 true
并且 false
如果没有更多相关事件发生(或者选择已变得稳定),例如...
import java.awt.EventQueue;
import java.awt.SystemColor;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class JavaApplication20 {
public static void main(String[] args) {
new JavaApplication20();
}
public JavaApplication20() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultListModel toAdd = new DefaultListModel();
toAdd.addElement("Male");
toAdd.addElement("Female");
toAdd.addElement("Others");
JList list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setBorder(new TitledBorder(null, "How do you identify yourself?", TitledBorder.CENTER, TitledBorder.TOP, null, null));
list.setBackground(SystemColor.info);
list.setModel(toAdd);
frame.getContentPane().add(new JScrollPane(list));
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) {
int lastSelIx = list.getMaxSelectionIndex();
String gender = (String) list.getModel().getElementAt(lastSelIx);
System.out.println(gender);
} else {
// You can ignore this, I was just testing ;)
int lastSelIx = event.getFirstIndex();
String gender = (String) list.getModel().getElementAt(lastSelIx);
System.out.println(gender);
}
}
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
您可以阅读How to Write a List Selection Listener了解更多详情
关于java - 双重打印JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956706/