Aquí es una interfaz de servicios públicos y de clase que hacen que sea fácil obtener un cuadro combinado para utilizar diferentes etiquetas. En lugar de crear un reemplazo ListCellRenderer
(y arriesgarse a que parezca fuera de lugar si se cambia la apariencia), este usa el valor predeterminado ListCellRenderer
(cualquiera que sea), pero intercambiando sus propias cadenas como texto de etiqueta en lugar de las que definido por toString()
en sus objetos de valor.
public interface ToString {
public String toString(Object object);
}
public final class ToStringListCellRenderer implements ListCellRenderer {
private final ListCellRenderer originalRenderer;
private final ToString toString;
public ToStringListCellRenderer(final ListCellRenderer originalRenderer,
final ToString toString) {
this.originalRenderer = originalRenderer;
this.toString = toString;
}
public Component getListCellRendererComponent(final JList list,
final Object value, final int index, final boolean isSelected,
final boolean cellHasFocus) {
return originalRenderer.getListCellRendererComponent(list,
toString.toString(value), index, isSelected, cellHasFocus);
}
}
Como se puede ver la ToStringListCellRenderer
para crear una cadena personalizada de la aplicación ToString
, y luego lo pasa a la original ListCellRenderer
en lugar de pasar en el valor propio objeto.
Para utilizar este código, hacer algo como lo siguiente:
// Create your combo box as normal, passing in the array of values.
final JComboBox combo = new JComboBox(values);
final ToString toString = new ToString() {
public String toString(final Object object) {
final YourValue value = (YourValue) object;
// Of course you'd make your own label text below.
return "custom label text " + value.toString();
}
};
combo.setRenderer(new ToStringListCellRenderer(
combo.getRenderer(), toString)));
Además de utilizar esto para hacer etiquetas personalizadas, si realiza una implementación ToString
que crea cadenas en base a la configuración regional del sistema, puede fácilmente internacionalice el cuadro combinado sin tener que cambiar nada en sus objetos de valor.
Esto funcionará, pero interrumpirá la navegación del teclado, que se basa en el toString de los elementos del combo. –
@JB Nizet: entonces la navegación del teclado está rota ;-) El camino a seguir es solucionarlo en lugar de hacks sucios en toString – kleopatra
@kleopatra: El código de navegación del teclado está profundamente oculto dentro de una clase interna no accesible de javax.swing .plaf.basic.BasicComboUI, y no hay manera fácil, aparte de volver a implementarlo y acoplarlo al renderizador, de anularlo. Estoy de acuerdo con su principio, pero el diseño de esta parte de Swing hace que sea muy doloroso seguir este principio. Creo que un objeto envoltorio genérico redefinir toString y delegar todo lo demás (es decir, hashCode) al objeto envuelto es una mejor solución. –