java - 双重打印JList

标签 java swing jlist

我不确定为什么所有内容都打印两次。例如,如果您按“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/

相关文章:

java - Android 语音转文本可以在模拟器中使用,但不能在手机上使用

Java 硬件加速

java - JList 不显示 JScrollpane 或更改大小

java - 在 JList 中使用自定义 JPanel 组件

java - JList 在自动滚动和自动选择时变坏(GUI 问题)

java - getActionBar() 在 actionBar 中返回 NULL

java - 使用多个 modelAttributes 从 JSP 接收 2 个对象

java - IBM MQ V6.0 是否设置 JMSXDeliveryCount 属性?

java - JButton 问题 -- Java Netbeans NullPointerException

java - JPanels 内的 JButtons,填满整个面板