Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Efectos Visuales en Swing

Buenas,

Hace tiempo que trabajo con swing pero nunca he sabido como introducir (si es posible) algunos efectos visuales, por ejemplo cuando se sitúa el ratón encima de un JButton que se produzca un cambio progresivo en el background o cuando un JTextFiel gana el foco...

Las pruebas que he realizado son muy simples, crear un hilo al que se le pasa el componente y en su método run poner un bucle que cambie el background (por ejemplo) 50 veces en un segundo. El resultado siempre es el mismo, cambia al último color establecido en el bucle pero no pinta ningún color intermedio. Codigo:

class MiHilo implements Runnable {
JButton boton;
public MiHilo(JButton boton) {
this.boton = boton;
}

@Override
public void run() {
int a = 0;
for (int i = 0; i < 20; i++) {
a = a +10;
boton.setBackground(new Color(a, a, 0));
boton.updateUI();
boton.invalidate();
boton.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

y el código que lo lanza:

boton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
MiHilo hijo = new MiHilo(boton);
hijo.run();
}
});

También he probado hacerlo con un Timer, pero el resultado es el mismo.

Alguien podría indicarme que información buscar, algún ejemplo o simplemente por donde van los tiros ?

Gracias.

mayo 9, 2012 | Unregistered Commenterpachucho1024

Todo código Swing que usa el RepaintManager debe ejecutarse necesariamente dentro del EDT.
Podrías probar con el Timer, pero el de Swing, a ver si notas cambios.

mayo 9, 2012 | Registered Commenterchoces

Disculpa que opine y espero no te incomode..
Para que te valga el codigo tienes que montarlo en un nuevo hilo en tu misma clase asi:
public class Efecto1_Boton implements Runnable{
JButton boton=null;
Thread hl=new Thread(this);
public Efecto1_Boton(JButton b){
boton=b;
}

public void play(){
hl.start();
}

public void run() {
int a = 0;
for (int i = 0; i < 20; i++) {
a = a +10;
boton.setBackground(new java.awt.Color(a, a, 0));
boton.updateUI();
boton.invalidate();
boton.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Asi solo usas el metodo play y te servira..

marzo 7, 2016 | Unregistered CommenterJorge Iñiguez

Que tal mi estimado,


Una forma eficiente de conseguir lo que buscas es crear una clase heredada de JButton, la cual sobreescribes el metodo paintComponent, al mismo que agregas listeners como FocusListener y MouseListener, en los cuales consigues el evento para producir el repintado y en el paintComponent puedes agregar un thread como los comentados en donde se cambia el aspecto del boton, luego puedes hacer uso del botón o textfield de forma similar a sus componente originales JButton y JTextField


Espero haberte ayudado, si tienes alguna duda puedo ayudarte con algún ejemplo, en algún lugar tengo archivado eso.

bye bye

marzo 12, 2016 | Unregistered CommenterGerman