package org.rsg.lib.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
public class JLabelFade extends JLabel {
Color start, end;
float rint, gint, bint, rdelta, gdelta, bdelta;
float r, g, b;
float rstart, rend, gstart, gend, bstart, bend;
boolean forward;
float maxint;
String maxstr;
public JLabelFade(Color s, Color e, String text){
super(text);
start = s;
end = e;
setBackground(start);
forward = true;
Fader();
}
void Fader(){
rint = fval(start.getRed(), end.getRed());
gint = fval(start.getGreen(), end.getGreen());
bint = fval(start.getBlue(), end.getBlue());
//TODO:in the over and under methods
maxint = Math.abs(rint); maxstr = "red"; //int and switch/case is better
if (maxint < Math.abs(gint)){ //than using string comparison
maxint = Math.abs(gint); maxstr = "green";
}
if (maxint < Math.abs(bint)){
maxint = Math.abs(bint); maxstr = "blue";
}
rdelta = rint / 100.0F;
gdelta = gint / 100.0F;
bdelta = bint / 100.0F;
rstart = fcolval(start.getRed());
gstart = fcolval(start.getGreen());
bstart = fcolval(start.getBlue());
rend = fcolval(end.getRed());
gend = fcolval(end.getGreen());
bend = fcolval(end.getBlue());
r = fcolval(start.getRed()); //set initial values
g = fcolval(start.getGreen());
b = fcolval(start.getBlue());
Timer t = new Timer(15, new ActionListener(){
public void actionPerformed(ActionEvent e){
setBackground(new Color(r, g, b));
if (r + g + b < 0.9){ // 1.5 or 1.0 might be better ...
setForeground(Color.white);
}
else{
setForeground(Color.black);
}
if (forward){
r += rdelta;
g += gdelta;
b += bdelta;
if (over(maxstr, r, g, b)){
r = rend;
g = gend;
b = bend;
forward = !forward;
}
}
else{
r -= rdelta;
g -= gdelta;
b -= bdelta;
if (under(maxstr, r, g, b)){
r = rstart;
g = gstart;
b = bstart;
forward = !forward;
}
}
}
});
t.start();
}
float fval(int colval0, int colval1){
float s = (float)colval0 / 255.0F;
float e = (float)colval1 / 255.0F;
return e - s;
}
float fcolval(int cv){
return (float)cv / 255.0F;
}
boolean over(String col, float r, float g, float b){
boolean retval;
if (col.equals("red")){
if (rint > 0){
retval = r > rend;
}
else{
retval = r < rend;
}
}
else if (col.equals("green")){
if (gint > 0){
retval = g > gend;
}
else{
retval = g < gend;
}
}
else{
if (bint > 0){
retval = b > bend;
}
else{
retval = b < bend;
}
}
return retval;
}
boolean under(String col, float r, float g, float b){
boolean retval;
if (col.equals("red")){
if (rint > 0){
retval = r < rstart;
}
else{
retval = r > rstart;
}
}
else if (col.equals("green")){
if (gint > 0){
retval = g < gstart;
}
else{
retval = g > gstart;
}
}
else{
if (bint > 0){
retval = b < bstart;
}
else{
retval = b > bstart;
}
}
return retval;
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// FadeJButton fjb = new FadeJButton(Color.red, Color.green, "FadeButton");
JLabelFade fjb1 = new JLabelFade(Color.yellow, Color.cyan, "FadeButton");
JLabelFade fjb2 = new JLabelFade(Color.red, Color.black, "FadeButton");
frame.add(fjb1, BorderLayout.NORTH);
frame.add(fjb2, BorderLayout.SOUTH);
frame.setBounds(0, 0, 200, 200);
frame.setVisible(true);
}
}