2017-08-20 3 views
0

c'est donc la première fois que j'ai essayé d'utiliser CellEditors pour mon JTable pour intégrer JComboBox et JSpinner. Tout fonctionne bien comme prévu dans lequel je peux voir les valeurs dans le modèle JComboBox ainsi que les valeurs du modèle JSpinner.Comment faire JTable avec JComboBox répondre uniquement sur un double clic au lieu de simple clic

Cependant, j'ai remarqué qu'il affiche toujours les valeurs de JComboBox dès que je fais un simple clic sur la colonne de JTable qui a le JComboBox.

Il est pas très facile à utiliser parce que je pense que l'utilisateur préférerait double-cliquer sur une colonne de JTable pour obtenir les valeurs de la boîte de liste déroulante et sélectionner les valeurs de celle-ci au lieu d'un seul clic. Comment puis-je modifier le comportement de JComboBox pour afficher uniquement double cliquez sur?

Je pensais appliquer un MouseListener au JComboBox mais je ne sais pas quoi faire ensuite.

Voici ce que j'ai écrit jusqu'à maintenant.

public class ScheduleDayCellEditor extends DefaultCellEditor{ 
    private JComboBox jcmbDays; 
    private JTable jtblSchedule; 
    private DefaultComboBoxModel model; 

    public ScheduleDayCellEditor(){ 
     super(new JComboBox()); 
     model = new DefaultComboBoxModel(new String[]{"Mon","Tue","Wed","Thu","Fri"}); 
     jcmbDays = new JComboBox(model); 
     jcmbDays.setEditable(false); 
     jcmbDays.setSelectedIndex(-1); 

     jcmbDays.addMouseListener(new MouseListener() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if(e.getClickCount() == 2){ 
        //? ? ? ? 
       } 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
      } 
     }); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     return jcmbDays; 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return jcmbDays.getSelectedItem(); //To change body of generated methods, choose Tools | Templates. 
    } 

Voici une capture d'écran pour une description additionnelle.

enter image description here

Je vous remercie de toute aide.

Merci.

Répondre

1

outrepasser simplement isCellEditable en appliquant critère supplémentaire:

@Override 
public boolean isCellEditable(EventObject aAnEvent) { 
    boolean cellEditable = super.isCellEditable(aAnEvent); 

    if (cellEditable && aAnEvent instanceof MouseEvent) { 
     cellEditable = ((MouseEvent) aAnEvent).getClickCount() == 2; 
    } 

    return cellEditable; 
} 
+0

merci pour votre réponse. Je ne savais pas que je peux le remplacer à partir de la classe étendue DefaultCellEditor. C'est résolu. – p3ace

1

Si vous ne besoin d'étendre DefaultCellEditor pour une autre raison, vous pouvez simplement invoquer sa méthode setClickCountToStart() avec un count de 2.

DefaultCellEditor editor = new DefaultCellEditor(jcmbDays); 
editor.setClickCountToStart(2); 
jcmbColumn.setCellEditor(editor);