Search code examples
javaswingjtablelistselectionlistener

Java ListSelectionListener interface with keyboard


I have implemented ListSelectionListener as you can see below, so that after a specific line in the first table is being chosen, the second table gets updated accordingly.

class SelectionListener implements ListSelectionListener {

    public SelectionListener(){}

    @Override
    public void valueChanged(ListSelectionEvent e) 
    {
        if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
            && myTrumpsAndMessages.jTable1.getRowSelectionAllowed()
            && e.getValueIsAdjusting()) 
        {
          int selected = myTrumpsAndMessages.jTable1.getSelectedRow();
            clearjTable(jTable4);
            showSubscribers(selected);
        }
    }

}

Is there a way to invoke the listener not only when the mouse is choosing, but also when the choice is being made from the keyboard?


Solution

  • The reason for the unusual experience - no notification on selection via keyboard - is a subtle different setting of valueIsAdjusting for keyboard vs. mouse-triggered selection events:

    • keyboard triggered selection (even with modifiers) only fires once (with adjusting == false)
    • mouse triggered selection always fires twice (first with true, second with false)

    That fact combined with the unusual logic (which @Robin spotted, +1 to him :-)

    if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
            && myTrumpsAndMessages.jTable1.getRowSelectionAllowed()
            // typo/misunderstanding or feature? doing stuff only when adjusting 
            && e.getValueIsAdjusting()) 
    

    (reacting only if the selection is adjusting) leads to not seeing keyboard triggered changes.