【问题标题】:Keeping a JList selection after JList has lost focus?在 JList 失去焦点后保持 JList 选择?
【发布时间】:2012-07-19 02:58:15
【问题描述】:

我正在尝试使用 JList 和按钮创建一个表单 我想要做的是从 JList 中选择一个项目,然后按下按钮执行依赖于选择的操作。但是,一旦单击按钮,JList 就会失去焦点,选择消失,导致按钮无法确定 JList 中选择了哪个元素。

有解决办法吗? 在此先感谢:)

【问题讨论】:

  • 我觉得这有点令人惊讶。单击按钮时,Jlist.getSelectedIndex() 返回 null?无论如何,您可以在每次更改选择时更新一个字段。

标签: java swing jbutton jlist listselectionlistener


【解决方案1】:

只需在每次进行选择时更新一个字段。您可以通过在 JList 上添加侦听器来做到这一点。

private class selectListener extends MouseAdapter {

    public void mouseClicked(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) { 
            currentSelected = list.getSelectedIndex();
        }
    }
}

然后在按下按钮时使用该字段。

【讨论】:

    【解决方案2】:
    • 我看不到 Oracle JList 教程中的示例有任何问题

    • 看看 ListSelectionListener

    • 可能要谨慎使用 SelectionModes

    • 你能描述一下你的目标是什么

    代码示例

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class ListDemo extends JPanel implements ListSelectionListener {
    
        private JList list;
        private DefaultListModel listModel;
        private static final String hireString = "Hire";
        private static final String fireString = "Fire";
        private JButton fireButton;
        private JTextField employeeName;
    
        public ListDemo() {
            super(new BorderLayout());
            listModel = new DefaultListModel();
            listModel.addElement("Jane Doe");
            listModel.addElement("John Smith");
            listModel.addElement("Kathy Green");
            list = new JList(listModel);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setSelectedIndex(0);
            list.addListSelectionListener(this);
            list.setVisibleRowCount(5);
            JScrollPane listScrollPane = new JScrollPane(list);
            JButton hireButton = new JButton(hireString);
            HireListener hireListener = new HireListener(hireButton);
            hireButton.setActionCommand(hireString);
            hireButton.addActionListener(hireListener);
            hireButton.setEnabled(false);
            fireButton = new JButton(fireString);
            fireButton.setActionCommand(fireString);
            fireButton.addActionListener(new FireListener());
            employeeName = new JTextField(10);
            employeeName.addActionListener(hireListener);
            employeeName.getDocument().addDocumentListener(hireListener);
            String name = listModel.getElementAt(list.getSelectedIndex()).toString();
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
            buttonPane.add(fireButton);
            buttonPane.add(Box.createHorizontalStrut(5));
            buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
            buttonPane.add(Box.createHorizontalStrut(5));
            buttonPane.add(employeeName);
            buttonPane.add(hireButton);
            buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            add(listScrollPane, BorderLayout.CENTER);
            add(buttonPane, BorderLayout.PAGE_END);
        }
    
        class FireListener implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
                int index = list.getSelectedIndex();
                listModel.remove(index);
                int size = listModel.getSize();
                if (size == 0) { //Nobody's left, disable firing.
                    fireButton.setEnabled(false);
                } else { //Select an index.
                    if (index == listModel.getSize()) {
                        index--;
                    }
                    list.setSelectedIndex(index);
                    list.ensureIndexIsVisible(index);
                }
            }
        }
    
        class HireListener implements ActionListener, DocumentListener {
    
            private boolean alreadyEnabled = false;
            private JButton button;
    
            public HireListener(JButton button) {
                this.button = button;
            }
    
            public void actionPerformed(ActionEvent e) {
                String name = employeeName.getText();
                if (name.equals("") || alreadyInList(name)) {
                    Toolkit.getDefaultToolkit().beep();
                    employeeName.requestFocusInWindow();
                    employeeName.selectAll();
                    return;
                }
                int index = list.getSelectedIndex(); //get selected index
                if (index == -1) { //no selection, so insert at beginning
                    index = 0;
                } else {           //add after the selected item
                    index++;
                }
                listModel.insertElementAt(employeeName.getText(), index);
                //listModel.addElement(employeeName.getText());
                employeeName.requestFocusInWindow();
                employeeName.setText("");
                list.setSelectedIndex(index);
                list.ensureIndexIsVisible(index);
            }
    
            protected boolean alreadyInList(String name) {
                return listModel.contains(name);
            }
    
            public void insertUpdate(DocumentEvent e) {
                enableButton();
            }
    
            public void removeUpdate(DocumentEvent e) {
                handleEmptyTextField(e);
            }
    
            public void changedUpdate(DocumentEvent e) {
                if (!handleEmptyTextField(e)) {
                    enableButton();
                }
            }
    
            private void enableButton() {
                if (!alreadyEnabled) {
                    button.setEnabled(true);
                }
            }
    
            private boolean handleEmptyTextField(DocumentEvent e) {
                if (e.getDocument().getLength() <= 0) {
                    button.setEnabled(false);
                    alreadyEnabled = false;
                    return true;
                }
                return false;
            }
        }
    
        public void valueChanged(ListSelectionEvent e) {
            if (e.getValueIsAdjusting() == false) {
    
                if (list.getSelectedIndex() == -1) {
                    fireButton.setEnabled(false);
                } else {
                    fireButton.setEnabled(true);
                }
            }
        }
    
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("ListDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JComponent newContentPane = new ListDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    【讨论】:

    • 这让我意识到我的问题是 JList 内容更新得太频繁了,这会重置选择
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2016-01-01
    • 2012-04-23
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多