¿Cómo puedo implementar un mejor efecto botón Fundido de oscilación?
-
23-08-2019 - |
Pregunta
Tengo un JButton
que, cuando se pulsa, cambia el color de fondo de activo a lo normal:
final Color activeButtonColor = new Color(159, 188, 191);
final Color normalButtonColor = new Color(47, 55, 56);
Quiero desaparecer el color del botón activa de nuevo al color del botón normal cuando una tarea específica ha terminado de ejecutarse. Estoy usando SwingWorker
y se preguntó si alguien podría sugerir una forma eficaz de hacer esto por favor?
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
new SwingWorker<Object, Object>() {
protected Object doInBackground() throws Exception {
button.setBackground(activeButtonColor);
for (int note = 60; note < 120; note++) {
midiController.sendMidiMessage(1, note, 83);
midiController.stopMidiMessage(note, 83);
}
Thread.sleep(200);
return null;
}
protected void done() {
try {
Object result = get();
// Fade back
} catch (Exception ex) {
ex.printStackTrace();
if (ex instanceof java.lang.InterruptedException)
return;
}
}
}.execute();
}
});
EDIT: Para que quede claro, yo estoy buscando una manera eficiente a desvanecerse los valores RGB para activeButtonColor
de nuevo a normalButtonColor
, sin tener que crear un gran número de objetos Color
. ¿Es posible? O es que sólo hay que limitar el número de pasos de fundido para ser más eficiente?
Solución
Crear un método que toma 3 argumentos, un botón, una de color y el color. Dentro del método, crear un SwingWorker para funcionar en el fondo que hace el desvanecimiento de los colores.
A continuación, en su ActionListener en el que hacer su trabajo, antes de hacer nada, llama al método de desvanecimiento de activa a la normalidad. Cuando su hecho, llame al método de fundido de normal a activo.
Usted va a terminar con 3 swingworkers totales se utilizan en esta situación. Uno para su trabajo, uno para la primera desaparecer y otro para el último desvanecimiento.
Otros consejos
Los objetos en color deben ser bastante ligero; que son básicamente sólo cuatro flotadores, además de un puñado de punteros a objetos ya existentes. Si realmente quiere ahorrar en instancias de objetos de color, y que te van los colores de inicio y finalización de arriba no va a cambiar, se puede calcular previamente los objetos de color para la secuencia de desvanecimiento, pero estoy bastante seguro de que podría calcular sobre la marcha así, y sufrir ninguna consecuencia.