Can I set the selected item for a JList without having an event thrown to the listeners?

前端 未结 2 662
我寻月下人不归
我寻月下人不归 2021-01-19 04:41

I am working on a viewer, which uses a JList to show thumbnails of the pages of a document. The user can open a page by selecting it through in the JList, or throught other

相关标签:
2条回答
  • 2021-01-19 05:05

    It looks like setSelectedIndex() is just a convenient way to set the selection in the ListSelectionModel. Maybe your ListModel could flag or cache the result so it won't get loaded a second time.

    0 讨论(0)
  • 2021-01-19 05:10
    1. You can remove all ListSelectionListener from the list, make a selection and then add them again.

    2. You can create your own ListSelectionModel with a method that doesn't throw the event and set it as a selection model to your JList, and then use getSelectionModel().yourSelectIndexMethod(index).

    3. You can also divert all your other methods of selection to the list, just find the corresponding entry if selecting the page by other means and select the item in the list. This way the item is selected and the page is loaded once.

    Code for option 2:

    public class ListTest extends JPanel{
    
    private static final String[] items = new String[]{"1", "2", "3"};
    private JList mylist;
    private JComboBox myCombo;
    private JTextArea myTA;
    
    public ListTest() {
        setLayout(new BorderLayout());
        myCombo = new JComboBox(items);
        myCombo.addActionListener(new ActionListener(){
    
            @Override
            public void actionPerformed(ActionEvent e){
                valueSelectedCombo(myCombo.getSelectedIndex());
            }
        });
        JPanel pn = new JPanel();
        pn.setLayout(new BoxLayout(pn, BoxLayout.X_AXIS));
        pn.add(myCombo);
        pn.add(Box.createHorizontalGlue());
        pn.add(new JButton(new AbstractAction("Clear"){
    
            @Override
            public void actionPerformed(ActionEvent e){
                myTA.setText("");
            }
        }));
        add(pn, BorderLayout.NORTH);
        add(new JScrollPane(getJList()), BorderLayout.WEST);
        add(new JScrollPane(myTA = new JTextArea()), BorderLayout.CENTER);
    }
    
    private void valueSelectedList(int index){
        myTA.setText(myTA.getText() + "\n" + items[index]);
    }
    
    private void valueSelectedCombo(int index){
        myTA.setText(myTA.getText() + "\n" + items[index]);
        ((CustomSelectionModel)mylist.getSelectionModel()).setSelectionSilent(index);
    }
    
    private JList getJList(){
        if (mylist == null){
            mylist = new JList(items);
            mylist.setSelectionModel(new CustomSelectionModel());
            mylist.addListSelectionListener(new ListSelectionListener(){
    
                @Override
                public void valueChanged(ListSelectionEvent e){
                    if (!e.getValueIsAdjusting()){
                        valueSelectedList(mylist.getSelectedIndex());
                    }
                }
            });
    
            mylist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            mylist.setPreferredSize(new Dimension(100, 106));
    
        }
        return mylist;
    }
    
    private static class CustomSelectionModel extends DefaultListSelectionModel{
    
        private boolean isSilent = false;
    
        public void setSelectionSilent(int firstIndex){
            isSilent = true;
            setSelectionInterval(firstIndex, firstIndex);
            isSilent = false;
        }
        protected void fireValueChanged(int firstIndex, int lastIndex, boolean isAdjusting){
            if (isSilent){
                return;
            }
            super.fireValueChanged(firstIndex, lastIndex, isAdjusting);
        }
    }
    
    public static void main(String[] args){
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        // Add content to the window.
        frame.add(new ListTest());
    
        // Display the window.
        frame.pack();
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
    
    }
    
    0 讨论(0)
提交回复
热议问题