![]() | Lecture 13 - slide 10 : 30 |
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*; // Aht. ChangeListener
public class ColorApplication {
public static void main (String[] args){
// Select look and feel
try {
UIManager.setLookAndFeel(
// UIManager.getCrossPlatformLookAndFeelClassName()
// UIManager.getSystemLookAndFeelClassName()
"com.sun.java.swing.plaf.motif.MotifLookAndFeel"
); } catch(Exception e) {};
JFrame f = new JFrame("Swing Color Application");
Container contentPane = f.getContentPane();
// Arrange for window closing:
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
ColorPresenter presenter = new ColorPresenter();
presenter.init();
contentPane.add("Center", presenter);
f.pack();
f.setSize(new Dimension(500,500));
f.setVisible(true);
}
} // end ColorModApplication
class ColorPanel extends JPanel {
public ColorPanel (JLabel lab, JTextField text,
JSlider slider, // AWT: Scrollbar.
ColorListener listener){
GridBagConstraints c = new GridBagConstraints();
GridBagLayout gridbag = new GridBagLayout();
setLayout(gridbag);
c.fill = GridBagConstraints.HORIZONTAL;
add(lab);
c.gridwidth = GridBagConstraints.REMAINDER;
gridbag.setConstraints(text, c);
add(text);
c.weightx = 1.0;
c.gridwidth = 1;
gridbag.setConstraints(slider, c);
slider.setMajorTickSpacing(50);
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
add(slider);
text.addActionListener (listener);
slider.addChangeListener (listener);
}
} // end class ColorPanel
class ColorPresenter extends JPanel {
public static final int Red = 0;
public static final int Green = 1;
public static final int Blue = 2;
/** Read the color from a text field specified by the parameter */
public int readColor (int COLOR) {
String str;
if (COLOR == Red) str = redTextField.getText();
else if (COLOR == Green) str = greenTextField.getText();
else if (COLOR == Blue) str = blueTextField.getText();
else str = "";
return Integer.parseInt(str);
}
/** Write the color to a text field as specified by the parameters */
public void writeColor (int COLOR, int val){
if (COLOR == Red) redTextField.setText(Integer.toString(val,10));
else if (COLOR == Green) greenTextField.setText(Integer.toString(val,10));
else if (COLOR == Blue) blueTextField.setText(Integer.toString(val,10));
}
/** Construct individual components */
private JLabel title = new JLabel ("Color adjuster");
private JLabel redLabel = new JLabel ("Red:");
private JTextField redTextField = new JTextField ("0",5);
private JSlider redSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);
private JLabel greenLabel = new JLabel ("Green:");
private JTextField greenTextField = new JTextField ("0",5);
private JSlider greenSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);
private JLabel blueLabel = new JLabel ("Blue:");
private JTextField blueTextField = new JTextField ("0",5);
private JSlider blueSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);
private JLabel hexTextField = new JLabel ("#000000");
private ColorBlop colorBlop = new ColorBlop(Color.white);
private ColorListener listener = new ColorListener (this);
private ColorPanel redGroup =
new ColorPanel(redLabel, redTextField, redSlider, listener);
private ColorPanel greenGroup =
new ColorPanel(greenLabel, greenTextField, greenSlider, listener);
private ColorPanel blueGroup =
new ColorPanel(blueLabel, blueTextField, blueSlider, listener);
/** Color Presenter Init */
public void init() {
setLayout(new GridLayout(6,1));
add(title);
add(redGroup); add(greenGroup); add(blueGroup);
add(colorBlop);
add(hexTextField);
adjust();
} //end init
private boolean inColorRange (int c){
return c >= 0 && c <= 255;
}
/* Given the scrollbar sl has changed it's value to val,
adjust the user interface*/
public void sliderAdjust (JSlider sl, int val){
if (sl == redSlider) writeColor(Red, val);
else if (sl == greenSlider) writeColor(Green, val);
else if (sl == blueSlider) writeColor(Blue, val);
adjust();
}
/* Given that a text field has been changed,
adjust the user interface */
public void adjust() {
Color newColor;
int r,g,b;
r = readColor(Red); g = readColor(Green); b = readColor(Blue);
if (inColorRange(r) && inColorRange(g) && inColorRange(b)){
newColor = new INColor(readColor(Red), readColor(Green), readColor(Blue));
colorBlop.setColor(newColor);
colorBlop.repaint();
hexTextField.setText(newColor.toString());
// adjust scrollbars:
redSlider.setValue(r); greenSlider.setValue(g); blueSlider.setValue(b);
} else hexTextField.setText("ERROR");
}
/* Puts a little space between the panel and its contents */
public Insets getInsets() {
return new Insets(10,10,10,10);
}
}
class ColorListener implements ActionListener, ChangeListener { // AWT: AdjustmentListener.
// Listens to events from components of a ColorPresenter
private ColorPresenter presentation;
private INColor currentColor;
public ColorListener (ColorPresenter presentation){
this.presentation = presentation;
}
public void actionPerformed(ActionEvent action){
presentation.adjust();
}
public void stateChanged (ChangeEvent adjustment){
JSlider source = (JSlider)adjustment.getSource();
presentation.sliderAdjust(source, (int)source.getValue());
}
} // end class ColorListener
class ColorBlop extends JPanel { // AWT: Canvas.
private Color currentColorOfBlop;
ColorBlop(Color c){
currentColorOfBlop = c;
}
public void setColor (Color c){
currentColorOfBlop = c;
}
public void paintComponent (Graphics page) { // AWT: paint.
super.paintComponent(page);
page.setColor(currentColorOfBlop);
page.fillRect(0,0,2000,200); // bred nok ...
}
} // end class ColorBlop
/** Color class extended with internet color encoding operation
which is redefined via toString() */
class INColor extends Color {
public INColor(int red, int green, int blue) {
super(red,green,blue);
}
private String twoCharColor(int colorNumber){
/* Convert the parameter, a color, to a hexadecimal number of length exactly two */
if (colorNumber >= 0 && colorNumber < 16) return "0" + Integer.toHexString(colorNumber);
else if (colorNumber >= 16 && colorNumber < 256) return Integer.toHexString(colorNumber);
else return "??";
}
public String toString () {
/** Return the seven character long internet color encoding of this color */
return "#" + twoCharColor(getRed()) + twoCharColor(getGreen()) + twoCharColor(getBlue());
}
}