Re: Could this be done better
Op Monday 24 Nov 2014 18:41 CET schreef Knute Johnson:
// private classes
private class Colour {
// public
public Colour(Color color, String description) {
this.color = color;
this.description = description;
}
public Color getColor() {
return color;
}
public String getDescription() {
return description;
}
// private
private Color color;
private String description;
}
private class SwitchColour extends TimerTask {
public void run() {
updateColour(getNextColour());
}
}
//private functions
private Colour getCurrentColour() {
return colours[currentColour];
}
private Colour getNextColour() {
currentColour = (currentColour + 1) % colours.length;
return getCurrentColour();
}
As much as I like your class Colour, it is probably easier and
simpler to use an enum in this case.
import java.awt.*;
public class test {
enum Colours {
Red(Color.RED),Blue(Color.BLUE),Green(Color.GREEN);
private final Color value;
Colours(Color value) {
this.value = value;
}
public Color value() {
return value;
}
}
public static void main(String... args) {
System.out.println(Colours.Red);
System.out.println(Colours.Red.value());
System.out.println();
for (Colours colour : Colours.values())
System.out.println(colour+":"+colour.value());
}
}
C:\Users\Knute Johnson>java test
Red
java.awt.Color[r=255,g=0,b=0]
Red:java.awt.Color[r=255,g=0,b=0]
Blue:java.awt.Color[r=0,g=0,b=255]
Green:java.awt.Color[r=0,g=255,b=0]
I did not know that you could use enums in that way.
But I see two problems.
1. You can not change the list of colours. (Not a problem in my case.)
2. Officially enums should be all caps.
The code is now:
import java.awt.*;
import java.util.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColourCycling extends JFrame {
// public functions
public ColourCycling() {
java.util.Timer colourTimer = new java.util.Timer();
getContentPane().setBackground(background);
setLayout(new GridBagLayout());
label = new JLabel(description + " : " + "XXXXXXXXXXXXXXX");
label.setFont(new Font("serif", Font.BOLD, 25));
add(label);
pack();
setSize(getWidth(), 3 * getHeight());
label.setBackground(background);
updateColour(getCurrentColour());
colourTimer.schedule(new SwitchColour(), delay, delay);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(description);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ColourCycling();
}
});
}
// private classes
private enum Colours {
Blue(Color.BLUE),
Red(Color.RED),
Orange(Color.ORANGE),
Yellow(Color.YELLOW),
Green(Color.GREEN),
Cyan(Color.CYAN),
Magenta(Color.MAGENTA),
Brown(new Color(0x9C, 0x5D, 0x52)),
;
private final Color value;
Colours(Color value) {
this.value = value;
}
public Color value() {
return value;
}
}
private class SwitchColour extends TimerTask {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
updateColour(getNextColour());
}
});
}
}
//private functions
private Colours getCurrentColour() {
return Colours.values()[currentColour];
}
private Colours getNextColour() {
currentColour = (currentColour + 1) % Colours.values().length;
return getCurrentColour();
}
private void updateColour(Colours newColour) {
label.setForeground(newColour.value());
label.setText(description + " : " + newColour);
}
// private variables
private Color background = Color.LIGHT_GRAY;
private int currentColour = 0;
private int delay = 4000;
private String description = "JTextArea Color Change Example";
private JLabel label;
}
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof