Estoy tratando de cambiar el color de un JToggleButton
cuando se ha seleccionado de manera fiable, se ve y se siente de forma independiente.Cambio del color de fondo de un JToggleButton seleccionado
Si se utiliza el metal L & M, a continuación, utilizando el UIManager es una aproximación:
UIManager.put("ToggleButton.selected", Color.RED);
Nota: Iyy señalado que tenía un error tipográfico en el nombre de la propiedad anterior, pero lo dejaré por encima de la gente para llegar hasta aquí, pero el nombre de la propiedad real se supone que es:
UIManager.put("ToggleButton.select", Color.RED);
sin embargo, esto no funciona en mi mirada actual y Feel (actualmente Windows XP). Después de algunos análisis posteriores, parece que el aspecto del sistema en Windows (todavía XP) no utiliza ninguna de las propiedades Color
basadas en para ToggleButton
, o al menos no las proporciona (hay un ejemplo rápido) en línea a find all property keys from the UIManager
, que en el ejemplo está convenientemente limitado explícitamente a Color
propiedades).
He intentado fijar el color de fondo:
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) { /* stuff */ }
};
JToggleButton button = new JToggleButton(action);
// tried with and without opaque true
button.setOpaque(true);
button.setBackground(Color.RED);
Ello no sólo no cambia el estado seleccionado, pero que ni siquiera Cómo afecta el estado no seleccionado.
He intentado cambiar el color de fondo sólo después de recibir la acción:
@Override
public void actionPerformed(ActionEvent e)
{
JToggleButton button = (JToggleButton)e.getSource();
if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY)
{
button.setBackground(Color.RED);
}
}
Nada de eso funciona. La única cosa que he encontrado para el trabajo me requiere para extraer el botón de mí mismo en el estado seleccionado (que conduce a un ejemplo de trabajo, aunque buscando no estándar):
private class ColoredToggleButton extends JToggleButton
{
ColoredToggleButton(Action action, Color color)
{
super(action);
setBackground(color);
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (this.isSelected())
{
int w = getWidth();
int h = getHeight();
String s = getText();
// selected color
g.setColor(getBackground());
g.fillRect(0, 0, w, h);
// selected foreground color
g.setColor(SystemColor.controlText);
g.drawString(s,
(w - g.getFontMetrics().stringWidth(s))/2 + 1,
(h + g.getFontMetrics().getAscent())/2 - 1);
}
}
}
que es ligeramente modificado a partir de un comentario en el esto Java bug report. Curiosamente (¿entretenido?), En las reclamaciones que se han corregido en 1998.
¿Alguien sabe de una manera mejor, L & F independiente para establecer el color de fondo de un JToggleButton seleccionado?
puede anular BasicbuttonUI o simplemente MetalButtonUI (entonces sólo para metal L & F) algún indicio http://stackoverflow.com/questions/5751311/creating-custom-button -in-java/5755124 # 5755124 – mKorbel
¿por qué? se supone que el LAF controla el aspecto, mejor deje que sea su deber; si logra interferir, su pintura/color personalizado sobresaldrá como un pulgar dolorido en todo – kleopatra
@kleopatra. Generalmente estoy de acuerdo en que dejar el L & F es una buena práctica, pero simplemente, esta es una característica deseada. En particular, en realidad está destinado a sobresalir. – pickypg