Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 557
Onca Avatar asked Aug 29 '12 20:08

Onca


2 Answers

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.

like image 131
kleopatra Avatar answered Sep 19 '22 09:09

kleopatra


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?

The listener will be triggered, independent of the source of the selection change. So yes, this is perfectly possible and even the default behavior. So nothing special must be done to get this working.

Looking at the code of your listener, I would suggest to rewrite it to

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

Note the quick break from the method when getValueIsAdjusting() returns true as this is the behavior you want in most cases.

like image 26
Robin Avatar answered Sep 22 '22 09:09

Robin