el método JComboBox.isTableCellEditor
funciona para el movimiento de flecha a través de la lista, pero no funciona para escritura anticipada compatible con KeySelectionManager. es decir, usted todavía obtiene ActionEvents para cada tecla que no sea de navegación que el usuario escriba, ya que JComboBox interpreta esos caracteres para buscar, aunque el modelo, moverse a (o acercarse a) la selección deseada por el usuario.
esta solución tiene el inconveniente de que cambie el comando de acción para los clics del ratón, que era un compromiso bien para mí, ya que el flujo de la interfaz gráfica de usuario obliga al usuario a cambiar el foco en el cuadro combinado
Terminé creando un KeyListener especial, que se basa en cambiar el comando de acción predeterminado del cuadro combinado de comboBoxChanged
a comboBoxMovement
. Aquí está la línea de código que necesito después de mi cuadro combinado es todo inicializado:
setExplicitSelectionManager(myComboBox);
... y aquí está el método y su clase contenidos que haga todo el trabajo:
private void setExplicitSelectionManager(JComboBox comboBox) {
class ExplicitSelectionManager implements KeyListener, FocusListener {
private JComboBox src;
private KeyListener superKeyListener;
ExplicitSelectionManager(JComboBox src) {
this.src = src;
// we like what the default key listener does, but not the action command
// it uses for ActionEvents it fires for plain text type-ahead characters
this.superKeyListener = src.getKeyListeners()[0]; // we only have one
src.removeKeyListener(superKeyListener); // will be replace right away, below
}
@Override
public void keyTyped(KeyEvent e) {
// basic combo box has no code in keyTyped
}
@Override
public void keyPressed(KeyEvent e) {
// in the default JComboBox implementation, the KeySelectionManager is
// called from keyPressed. I'm fine with the implementation of
// the default, but I don't want it firing ActionEvents that will cause
// model updates
src.setActionCommand("comboBoxMovement");
this.superKeyListener.keyPressed(e);
src.setActionCommand("comboBoxChanged");
if (e.getKeyCode() == 10) {
src.setSelectedIndex(src.getSelectedIndex());
}
}
@Override
public void keyReleased(KeyEvent e) {
// basic combo box has no code in keyReleased
}
@Override
public void focusGained(FocusEvent e) {
}
@Override
// this will also give us the event we want, if the user decides to Tab out of
// the combo box, instead of hitting Enter
public void focusLost(FocusEvent e) {
src.setSelectedIndex(src.getSelectedIndex());
}
}
ExplicitSelectionManager newSelectionManager = new ExplicitSelectionManager(comboBox);
comboBox.addKeyListener(newSelectionManager);
comboBox.addFocusListener(newSelectionManager);
}
... y aquí está el método de acción realizada
private void comboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox source = (JComboBox) evt.getSource();
// "comboBoxChanged" is the default,
// so any normal JComboBox can also use this action listener
if (evt.getActionCommand().equals("comboBoxChanged")) {
updateModel(source.getName(), (String) source.getSelectedItem());
}
}
Sí, esto es exactamente lo que quería lograr. Muchas gracias. – toomyem
Parece que esto no funciona para PgUp/PgDn. –