JList项目选择

时间:2015-10-05 03:26:07

标签: java swing jlist listselectionlistener

我想知道是否有办法,通过选择带有JList的项目,让程序执行一些代码。每次选择新项目时都应运行此代码。

以前,我添加了一个监听器。这是我做的最小例子。

public class Driver {

    public static void main(String[] args) {
        JFrame frame = new ListFrame();
        frame.setVisible(true);
        frame.setSize(200,100);
    }

}

public class ListFrame extends JFrame {

    private JList<String> list; 
    private JScrollPane scrollPane;
    private String[] data = {"A","B","C"};
    private JButton addButton = new JButton("Add");

    public ListFrame() {
        setLayout(new BorderLayout());

        list = new JList<String>(data);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        scrollPane = new JScrollPane(list);

        add(scrollPane, BorderLayout.CENTER);
        add(addButton, BorderLayout.SOUTH);

        addButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                String newEntry = JOptionPane.showInputDialog("Add new entry.");
                String[] tempData = new String[data.length + 1];
                for(int i = 0; i < data.length; i++)
                    tempData[i] = data[i];
                tempData[data.length] = newEntry;
                data = tempData;
                list = new JList<String>(data);
                scrollPane.setViewportView(list);
            }

        });

        list.addListSelectionListener(
                new ListSelectionListener() {

                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        System.out.println("Hi");
                    }

        });
    }
}

但是,当我单击Jlist上的某个项目时,不会打印任何内容。

1 个答案:

答案 0 :(得分:3)

您的示例使用getSelectionModel()获取列表ListSelectionModel,并将您的侦听器直接添加到选择模型中。这会绕过由JList内部使用的ListSelectionHandlerfireSelectionValueChanged()永远不会有机会JList。相反,让list.addListSelectionListener(new ListSelectionListener() {...} 添加您的听众:

JList
  

当我点击ListSelectionEvent上的某个项目时,没有打印任何内容。

您的新示例打印&#34;嗨&#34;当我点击某个项目时,我发现了一些问题:

  • 请务必使用event dispatch thread

  • 查看JList了解发生的事情的详细信息。

  • 要向列表中添加元素,请不要创建新的ListModel;更新列表&#39; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class Driver { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new ListFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }); } private static class ListFrame extends JFrame { private final String[] data = {"A", "B", "C"}; private final DefaultListModel model = new DefaultListModel(); private final JList<String> list = new JList<>(model); private final JButton addButton = new JButton("Add"); public ListFrame() { for (String s : data) { model.addElement(s); } list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); add(new JScrollPane(list), BorderLayout.CENTER); add(addButton, BorderLayout.SOUTH); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { String newEntry = JOptionPane.showInputDialog("Add new entry."); model.addElement(newEntry); } }); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { System.out.println(e.getFirstIndex() + " " + e.getLastIndex()); } } }); } } } 而不是

有关详情,请参阅How to Write a List Selection Listener;这是我测试的例子。

composer.json