package de.bht.fb6.cg1.exercise1;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* This class represents the ColorConverter.
*
* An application to convert colors between differen color models.
*
* @author Stephan Rehfeld <rehfeld (-at-) beuth-hochschule.de>
*/
public class ColorConverterJFrame extends JFrame implements ChangeListener {
/**
* The main method.
*
* @param args Console parameters. This main method does not consume any parameters.
*/
public static void main( final String args[] ) {
java.awt.EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
new ColorConverterJFrame().setVisible(true);
}
});
}
/**
* This attribute indicates that the program is currently updating the slider and should not react on value changes.
*/
private boolean update;
/**
* This is the canvas that shows the current color.
*/
private Canvas colorCanvas;
/**
* The current color.
*/
private Color currentColor;
/**
* The panel that holds all controls for RGB color.
*/
private JPanel rgbPanel;
/**
* The panel that holds all controls for YUV color.
*/
private JPanel yuvPanel;
/**
* The panel that holds all controls for CMY color.
*/
private JPanel cmyPanel;
/**
* This slider controls the r component of RGB.
*/
private JSlider rSlider;
/**
* This text field shows the current value of the r component of RGB.
*/
private JTextField rTextField;
/**
* This slider controls the g component of RGB.
*/
private JSlider gSlider;
/**
* This text field shows the current value of the g component of RGB.
*/
private JTextField gTextField;
/**
* This slider controls the b component of RGB.
*/
private JSlider bSlider;
/**
* This text field shows the current value of the b component of RGB.
*/
private JTextField bTextField;
/**
* This slider controls the y component of YUV.
*/
private JSlider ySlider;
/**
* This text field shows the current value of the y component of YUV.
*/
private JTextField yTextField;
/**
* This slider controls the u component of YUV.
*/
private JSlider uSlider;
/**
* This text field shows the current value of the u component of YUV.
*/
private JTextField uTextField;
/**
* This slider controls the v component of YUV.
*/
private JSlider vSlider;
/**
* This text field shows the current value of the v component of YUV.
*/
private JTextField vTextField;
/**
* This slider controls the c component of CMY.
*/
private JSlider cSlider;
/**
* This text field shows the current value of the c component of CMY.
*/
private JTextField cTextField;
/**
* This slider controls the m component of CMY.
*/
private JSlider mSlider;
/**
* This text field shows the current value of the m component of CMY.
*/
private JTextField mTextField;
/**
* This slider controls the y component of CMY.
*/
private JSlider y2Slider;
/**
* This text field shows the current value of the y component of CMY.
*/
private JTextField y2TextField;
/**
* This constructor creates a new Frame of the ColorConverter with the size 640x480.
* It already close it self if requested and has the correct frame title.
*
*/
public ColorConverterJFrame() {
super( "Color Converter" );
this.update = false;
this.setSize( 640, 480 );
this.setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE );
this.setLayout( new GridLayout( 0, 1 ) );
this.currentColor = Color.WHITE;
this.createColorCanvas();
this.createRGBPanel();
this.createYUVPanel();
this.createCMYPanel();
this.pack();
}
/**
* This method creates the color canvas
*/
private void createColorCanvas() {
this.colorCanvas = new Canvas();
this.colorCanvas.setBackground( this.currentColor );
this.add( this.colorCanvas );
}
/**
* This method creates the panel for RGB
*/
private void createRGBPanel() {
this.rgbPanel = new JPanel();
this.rgbPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
this.add( this.rgbPanel );
this.rgbPanel.setLayout( new GridLayout( 3, 3 ) );
final JLabel rLabel = new JLabel( "R" );
this.rgbPanel.add( rLabel );
this.rSlider = new JSlider( 0, 255, 255 );
this.rgbPanel.add( this.rSlider );
this.rSlider.addChangeListener( this );
this.rTextField = new JTextField();
this.rgbPanel.add( this.rTextField );
this.rTextField.setText( "255" );
this.rTextField.setEnabled( false );
final JLabel gLabel = new JLabel( "G" );
this.rgbPanel.add( gLabel );
this.gSlider = new JSlider( 0, 255, 255 );
this.rgbPanel.add( this.gSlider );
this.gSlider.addChangeListener( this );
this.gTextField = new JTextField();
this.rgbPanel.add( this.gTextField );
this.gTextField.setText( "255" );
this.gTextField.setEnabled( false );
final JLabel bLabel = new JLabel( "B" );
this.rgbPanel.add( bLabel );
this.bSlider = new JSlider( 0, 255, 255 );
this.rgbPanel.add( this.bSlider );
this.bSlider.addChangeListener( this );
this.bTextField = new JTextField();
this.rgbPanel.add( this.bTextField );
this.bTextField.setText( "255" );
this.bTextField.setEnabled( false );
}
/**
* This method creates the panel for YUV
*/
private void createYUVPanel() {
this.yuvPanel = new JPanel();
this.yuvPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
this.add( this.yuvPanel );
this.yuvPanel.setLayout( new GridLayout( 3, 3 ) );
final JLabel yLabel = new JLabel( "Y" );
this.yuvPanel.add( yLabel );
this.ySlider = new JSlider( 0, 255, 255 );
this.yuvPanel.add( this.ySlider );
this.ySlider.addChangeListener( this );
this.yTextField = new JTextField();
this.yuvPanel.add( this.yTextField );
this.yTextField.setText( "255" );
this.yTextField.setEnabled( false );
final JLabel uLabel = new JLabel( "U" );
this.yuvPanel.add( uLabel );
this.uSlider = new JSlider( 0, 255, 255 );
this.yuvPanel.add( this.uSlider );
this.uSlider.addChangeListener( this );
this.uTextField = new JTextField();
this.yuvPanel.add( this.uTextField );
this.uTextField.setText( "255" );
this.uTextField.setEnabled( false );
final JLabel vLabel = new JLabel( "V" );
this.yuvPanel.add( vLabel );
this.vSlider = new JSlider( 0, 255, 255 );
this.yuvPanel.add( this.vSlider );
this.vSlider.addChangeListener( this );
this.vTextField = new JTextField();
this.yuvPanel.add( this.vTextField );
this.vTextField.setText( "255" );
this.vTextField.setEnabled( false );
}
/**
* This method creates the panel for RGB
*/
private void createCMYPanel() {
this.cmyPanel = new JPanel();
this.cmyPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
this.add( this.cmyPanel );
this.cmyPanel.setLayout( new GridLayout( 3, 3 ) );
final JLabel cLabel = new JLabel( "C" );
this.cmyPanel.add( cLabel );
this.cSlider = new JSlider( 0, 255, 255 );
this.cmyPanel.add( this.cSlider );
this.cSlider.addChangeListener( this );
this.cTextField = new JTextField();
this.cmyPanel.add( this.cTextField );
this.cTextField.setText( "255" );
this.cTextField.setEnabled( false );
final JLabel mLabel = new JLabel( "M" );
this.cmyPanel.add( mLabel );
this.mSlider = new JSlider( 0, 255, 255 );
this.cmyPanel.add( this.mSlider );
this.mSlider.addChangeListener( this );
this.mTextField = new JTextField();
this.cmyPanel.add( this.mTextField );
this.mTextField.setText( "255" );
this.mTextField.setEnabled( false );
final JLabel y2Label = new JLabel( "Y" );
this.cmyPanel.add( y2Label );
this.y2Slider = new JSlider( 0, 255, 255 );
this.cmyPanel.add( this.y2Slider );
this.y2Slider.addChangeListener( this );
this.y2TextField = new JTextField();
this.cmyPanel.add( this.y2TextField );
this.y2TextField.setText( "255" );
this.y2TextField.setEnabled( false );
}
@Override
public void stateChanged( final ChangeEvent e ) {
if( !this.update ) {
if( e.getSource() == this.rSlider && Integer.parseInt( this.rTextField.getText() ) != this.rSlider.getValue() ) {
this.rTextField.setText( "" + this.rSlider.getValue() );
this.currentColor = new Color( this.rSlider.getValue(), this.currentColor.getGreen(), this.currentColor.getBlue() );
} else if( e.getSource() == this.gSlider && Integer.parseInt( this.gTextField.getText() ) != this.gSlider.getValue() ) {
this.gTextField.setText( "" + this.gSlider.getValue() );
this.currentColor = new Color( this.currentColor.getRed(), this.gSlider.getValue(), this.currentColor.getBlue() );
} else if( e.getSource() == this.bSlider && Integer.parseInt( this.bTextField.getText() ) != this.bSlider.getValue() ) {
this.bTextField.setText( "" + this.bSlider.getValue() );
this.currentColor = new Color( this.currentColor.getRed(), this.currentColor.getGreen(), this.bSlider.getValue() );
} else if( e.getSource() == this.ySlider && Integer.parseInt( this.yTextField.getText() ) != this.ySlider.getValue() ) {
this.yTextField.setText( "" + this.ySlider.getValue() );
this.currentColor = new Color( this.currentColor.getRed(), this.currentColor.getGreen(), this.currentColor.getBlue() );
} else if( e.getSource() == this.uSlider && Integer.parseInt( this.uTextField.getText() ) != this.uSlider.getValue() ) {
this.uTextField.setText( "" + this.uSlider.getValue() );
} else if( e.getSource() == this.vSlider && Integer.parseInt( this.vTextField.getText() ) != this.vSlider.getValue() ) {
this.vTextField.setText( "" + this.vSlider.getValue() );
} else if( e.getSource() == this.cSlider && Integer.parseInt( this.cTextField.getText() ) != this.cSlider.getValue() ) {
this.cTextField.setText( "" + this.cSlider.getValue() );
} else if( e.getSource() == this.mSlider && Integer.parseInt( this.mTextField.getText() ) != this.mSlider.getValue() ) {
this.mTextField.setText( "" + this.mSlider.getValue() );
} else if( e.getSource() == this.y2Slider && Integer.parseInt( this.y2TextField.getText() ) != this.y2Slider.getValue() ) {
this.y2TextField.setText( "" + this.y2Slider.getValue() );
}
this.colorCanvas.setBackground( this.currentColor );
this.update();
}
}
/**
* This method updates all other components if one component has changed.
*/
private void update() {
this.update = true;
this.update = false;
}
}