双打印JList

问题描述 投票:0回答:2

我不确定为什么一切都打印两次。例如,如果按“男性”,则程序将打印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);
        }       
    );
}
java swing jlist
2个回答
0
投票

每次单击列表中的项目时都会生成两个事件:第一个是在按下鼠标按钮时创建的,第二个是在释放按钮时创建的。

(这主要与范围选择,拖放的更复杂模式,或者您按下一个项目上的按钮然后将鼠标拖动到另一个项目的情况有关)

解决方案是检查ListSelectionListener中的“选择值是否仍在调整”。所以你可以做点什么

if (event.getValueIsAdjusting()) return;

在您的事件监听器方法中。

这里作为MCVE,以及其他一些清理:

import java.awt.SystemColor;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class JListSelectionDoubleEvent
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui()
    {
        DefaultListModel<String> listModel = new DefaultListModel<String>();
        listModel.addElement("Male");
        listModel.addElement("Female");
        listModel.addElement("Others");

        JList<String> list = new JList<String>(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setBorder(
            BorderFactory.createTitledBorder("How do you identify yourself?"));
        list.setBackground(SystemColor.info);

        list.addListSelectionListener(new ListSelectionListener()
        {
            @Override
            public void valueChanged(ListSelectionEvent event)
            {
                if (event.getValueIsAdjusting())
                {
                    //System.out.println("Adjusting. Ignore this");
                    return;
                }
                String gender = list.getSelectedValue();
                System.out.print(gender);
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(list);
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

1
投票

一般来说,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了解更多详情

© www.soinside.com 2019 - 2024. All rights reserved.