Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Sobreescribir el método paintComponent de JToggleButton

Buenas a todos!

Tengo un JToggleButton que muestra un icono y un texto, pero no el area del botón en sí (setContentAreaFilled(false)).

Lo que quiero hacer es cuando esté en estado hover y en estado selected aparezca un fondo degradado. Se que tengo que hacerlo sobreescribiendo el método paintComponent, pero claro, si pinto el fondo en este método desaparecen tanto el Icono establecido por setIcon() y el texto que tenía.

Sabéis cómo debo hacerlo para que después de pintar el fondo degradado, se pinte el icono y el texto que ya tenía establecido. Y lo más importante que aparezcan en el lugar que aparecían. Y también sabriais como puedo saber cuando está en estado RollOver?

Este es el ejemplo que tengo de como he hecho hasta ahora:


class MiToggle extends JToggleButton {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;

if (isSelected()) {
RoundRectangle2D.Double rect = new RoundRectangle2D.Double(0.5, 0.5, 90.0, 50.0, 2.0, 2.0);
g2D.setPaint(new GradientPaint(new Point2D.Double(0.0, 0.0), new Color(255, 255, 255, 255),
new Point2D.Double(0.0, 1.0), new Color(207, 231, 237, 255)));
g2D.fill(rect);
}

//Aquí debo pintar el icono y el texto en el lugar correspondiente (como lo haría JToggleButton)
}
}

Muchas Gracias a todos!!!

marzo 27, 2012 | Registered Commenterhuspy

Puedes probar con este bloque de código, al final del método:

setOpaque(false);
super.paintComponent(g2D);
setOpaque(true);

eliminando la línea super.paintComponent(g); al principio.
Es lo que suelo hacer para "pintar las cebras" en los JTable, JList y JTree.
Probablemente también necesites ejecutar: setOpaque(true); en el constructor del JButton.

marzo 27, 2012 | Registered Commenterchoces

Buenas de nuevo!

Ya he encontrado la solución, pongo el código:


class MiBoton extends JToggleButton {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2D = (Graphics2D) g.create();
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

if (getModel().isSelected() || getModel().isRollover()) {
RoundRectangle2D shape0 = new RoundRectangle2D.Double(0.5, 0.5, getWidth() - 1, getHeight() - 1, 2.0, 2.0);
g2D.setPaint(new GradientPaint(new Point2D.Double(0.0, 0.0), new Color(255, 255, 255, 255),
new Point2D.Double(0.0, 1.0), new Color(207, 231, 237, 255)));
g2D.fill(shape0);
}

super.paintComponent(g);
}
}

Tenía que poner la llamada al padre de paintComponent() después de pintar el fondo. Además para saber si está en estado rollover se hace desde el modelo del boton, getModel().isRollover().

Saludos!

marzo 27, 2012 | Registered Commenterhuspy