1. package de.bht.fb6.cg1.exercise1;
  2.  
  3. import java.awt.Canvas;
  4. import java.awt.Color;
  5. import java.awt.GridLayout;
  6. import javax.swing.JFrame;
  7. import javax.swing.JLabel;
  8. import javax.swing.JPanel;
  9. import javax.swing.JSlider;
  10. import javax.swing.JTextField;
  11. import javax.swing.event.ChangeEvent;
  12. import javax.swing.event.ChangeListener;
  13.  
  14. /**
  15.  * This class represents the ColorConverter.
  16.  *
  17.  * An application to convert colors between differen color models.
  18.  *
  19.  * @author Stephan Rehfeld <rehfeld (-at-) beuth-hochschule.de>
  20.  */
  21. public class ColorConverterJFrame extends JFrame implements ChangeListener {
  22.  
  23. /**
  24. * The main method.
  25. *
  26. * @param args Console parameters. This main method does not consume any parameters.
  27. */
  28. public static void main( final String args[] ) {
  29. java.awt.EventQueue.invokeLater( new Runnable() {
  30.  
  31. @Override
  32. public void run() {
  33. new ColorConverterJFrame().setVisible(true);
  34. }
  35.  
  36. });
  37. }
  38.  
  39. /**
  40. * This attribute indicates that the program is currently updating the slider and should not react on value changes.
  41. */
  42. private boolean update;
  43.  
  44. /**
  45. * This is the canvas that shows the current color.
  46. */
  47. private Canvas colorCanvas;
  48.  
  49. /**
  50. * The current color.
  51. */
  52. private Color currentColor;
  53.  
  54. /**
  55. * The panel that holds all controls for RGB color.
  56. */
  57. private JPanel rgbPanel;
  58.  
  59. /**
  60. * The panel that holds all controls for YUV color.
  61. */
  62. private JPanel yuvPanel;
  63.  
  64. /**
  65. * The panel that holds all controls for CMY color.
  66. */
  67. private JPanel cmyPanel;
  68.  
  69. /**
  70. * This slider controls the r component of RGB.
  71. */
  72. private JSlider rSlider;
  73.  
  74. /**
  75. * This text field shows the current value of the r component of RGB.
  76. */
  77. private JTextField rTextField;
  78.  
  79. /**
  80. * This slider controls the g component of RGB.
  81. */
  82. private JSlider gSlider;
  83.  
  84. /**
  85. * This text field shows the current value of the g component of RGB.
  86. */
  87. private JTextField gTextField;
  88.  
  89. /**
  90. * This slider controls the b component of RGB.
  91. */
  92. private JSlider bSlider;
  93.  
  94. /**
  95. * This text field shows the current value of the b component of RGB.
  96. */
  97. private JTextField bTextField;
  98.  
  99. /**
  100. * This slider controls the y component of YUV.
  101. */
  102. private JSlider ySlider;
  103.  
  104. /**
  105. * This text field shows the current value of the y component of YUV.
  106. */
  107. private JTextField yTextField;
  108.  
  109. /**
  110. * This slider controls the u component of YUV.
  111. */
  112. private JSlider uSlider;
  113.  
  114. /**
  115. * This text field shows the current value of the u component of YUV.
  116. */
  117. private JTextField uTextField;
  118.  
  119. /**
  120. * This slider controls the v component of YUV.
  121. */
  122. private JSlider vSlider;
  123.  
  124. /**
  125. * This text field shows the current value of the v component of YUV.
  126. */
  127. private JTextField vTextField;
  128.  
  129. /**
  130. * This slider controls the c component of CMY.
  131. */
  132. private JSlider cSlider;
  133.  
  134. /**
  135. * This text field shows the current value of the c component of CMY.
  136. */
  137. private JTextField cTextField;
  138.  
  139. /**
  140. * This slider controls the m component of CMY.
  141. */
  142. private JSlider mSlider;
  143.  
  144. /**
  145. * This text field shows the current value of the m component of CMY.
  146. */
  147. private JTextField mTextField;
  148.  
  149. /**
  150. * This slider controls the y component of CMY.
  151. */
  152. private JSlider y2Slider;
  153.  
  154. /**
  155. * This text field shows the current value of the y component of CMY.
  156. */
  157. private JTextField y2TextField;
  158.  
  159. /**
  160. * This constructor creates a new Frame of the ColorConverter with the size 640x480.
  161. * It already close it self if requested and has the correct frame title.
  162. *
  163. */
  164. public ColorConverterJFrame() {
  165. super( "Color Converter" );
  166. this.update = false;
  167. this.setSize( 640, 480 );
  168. this.setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE );
  169.  
  170. this.setLayout( new GridLayout( 0, 1 ) );
  171.  
  172. this.currentColor = Color.WHITE;
  173.  
  174. this.createColorCanvas();
  175. this.createRGBPanel();
  176. this.createYUVPanel();
  177. this.createCMYPanel();
  178.  
  179. this.pack();
  180.  
  181. }
  182.  
  183. /**
  184. * This method creates the color canvas
  185. */
  186. private void createColorCanvas() {
  187. this.colorCanvas = new Canvas();
  188. this.colorCanvas.setBackground( this.currentColor );
  189. this.add( this.colorCanvas );
  190.  
  191.  
  192. }
  193.  
  194. /**
  195. * This method creates the panel for RGB
  196. */
  197. private void createRGBPanel() {
  198. this.rgbPanel = new JPanel();
  199. this.rgbPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
  200. this.add( this.rgbPanel );
  201. this.rgbPanel.setLayout( new GridLayout( 3, 3 ) );
  202.  
  203. final JLabel rLabel = new JLabel( "R" );
  204. this.rgbPanel.add( rLabel );
  205.  
  206. this.rSlider = new JSlider( 0, 255, 255 );
  207. this.rgbPanel.add( this.rSlider );
  208. this.rSlider.addChangeListener( this );
  209.  
  210. this.rTextField = new JTextField();
  211. this.rgbPanel.add( this.rTextField );
  212. this.rTextField.setText( "255" );
  213. this.rTextField.setEnabled( false );
  214.  
  215. final JLabel gLabel = new JLabel( "G" );
  216. this.rgbPanel.add( gLabel );
  217.  
  218. this.gSlider = new JSlider( 0, 255, 255 );
  219. this.rgbPanel.add( this.gSlider );
  220. this.gSlider.addChangeListener( this );
  221.  
  222. this.gTextField = new JTextField();
  223. this.rgbPanel.add( this.gTextField );
  224. this.gTextField.setText( "255" );
  225. this.gTextField.setEnabled( false );
  226.  
  227. final JLabel bLabel = new JLabel( "B" );
  228. this.rgbPanel.add( bLabel );
  229.  
  230. this.bSlider = new JSlider( 0, 255, 255 );
  231. this.rgbPanel.add( this.bSlider );
  232. this.bSlider.addChangeListener( this );
  233.  
  234. this.bTextField = new JTextField();
  235. this.rgbPanel.add( this.bTextField );
  236. this.bTextField.setText( "255" );
  237. this.bTextField.setEnabled( false );
  238. }
  239.  
  240. /**
  241. * This method creates the panel for YUV
  242. */
  243. private void createYUVPanel() {
  244. this.yuvPanel = new JPanel();
  245. this.yuvPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
  246. this.add( this.yuvPanel );
  247. this.yuvPanel.setLayout( new GridLayout( 3, 3 ) );
  248.  
  249. final JLabel yLabel = new JLabel( "Y" );
  250. this.yuvPanel.add( yLabel );
  251.  
  252. this.ySlider = new JSlider( 0, 255, 255 );
  253. this.yuvPanel.add( this.ySlider );
  254. this.ySlider.addChangeListener( this );
  255.  
  256. this.yTextField = new JTextField();
  257. this.yuvPanel.add( this.yTextField );
  258. this.yTextField.setText( "255" );
  259. this.yTextField.setEnabled( false );
  260.  
  261. final JLabel uLabel = new JLabel( "U" );
  262. this.yuvPanel.add( uLabel );
  263.  
  264. this.uSlider = new JSlider( 0, 255, 255 );
  265. this.yuvPanel.add( this.uSlider );
  266. this.uSlider.addChangeListener( this );
  267.  
  268. this.uTextField = new JTextField();
  269. this.yuvPanel.add( this.uTextField );
  270. this.uTextField.setText( "255" );
  271. this.uTextField.setEnabled( false );
  272.  
  273. final JLabel vLabel = new JLabel( "V" );
  274. this.yuvPanel.add( vLabel );
  275.  
  276. this.vSlider = new JSlider( 0, 255, 255 );
  277. this.yuvPanel.add( this.vSlider );
  278. this.vSlider.addChangeListener( this );
  279.  
  280. this.vTextField = new JTextField();
  281. this.yuvPanel.add( this.vTextField );
  282. this.vTextField.setText( "255" );
  283. this.vTextField.setEnabled( false );
  284. }
  285.  
  286. /**
  287. * This method creates the panel for RGB
  288. */
  289. private void createCMYPanel() {
  290. this.cmyPanel = new JPanel();
  291. this.cmyPanel.setBorder( javax.swing.BorderFactory.createEtchedBorder() );
  292. this.add( this.cmyPanel );
  293. this.cmyPanel.setLayout( new GridLayout( 3, 3 ) );
  294.  
  295. final JLabel cLabel = new JLabel( "C" );
  296. this.cmyPanel.add( cLabel );
  297.  
  298. this.cSlider = new JSlider( 0, 255, 255 );
  299. this.cmyPanel.add( this.cSlider );
  300. this.cSlider.addChangeListener( this );
  301.  
  302. this.cTextField = new JTextField();
  303. this.cmyPanel.add( this.cTextField );
  304. this.cTextField.setText( "255" );
  305. this.cTextField.setEnabled( false );
  306.  
  307. final JLabel mLabel = new JLabel( "M" );
  308. this.cmyPanel.add( mLabel );
  309.  
  310. this.mSlider = new JSlider( 0, 255, 255 );
  311. this.cmyPanel.add( this.mSlider );
  312. this.mSlider.addChangeListener( this );
  313.  
  314. this.mTextField = new JTextField();
  315. this.cmyPanel.add( this.mTextField );
  316. this.mTextField.setText( "255" );
  317. this.mTextField.setEnabled( false );
  318.  
  319. final JLabel y2Label = new JLabel( "Y" );
  320. this.cmyPanel.add( y2Label );
  321.  
  322. this.y2Slider = new JSlider( 0, 255, 255 );
  323. this.cmyPanel.add( this.y2Slider );
  324. this.y2Slider.addChangeListener( this );
  325.  
  326. this.y2TextField = new JTextField();
  327. this.cmyPanel.add( this.y2TextField );
  328. this.y2TextField.setText( "255" );
  329. this.y2TextField.setEnabled( false );
  330. }
  331.  
  332. @Override
  333. public void stateChanged( final ChangeEvent e ) {
  334. if( !this.update ) {
  335. if( e.getSource() == this.rSlider && Integer.parseInt( this.rTextField.getText() ) != this.rSlider.getValue() ) {
  336. this.rTextField.setText( "" + this.rSlider.getValue() );
  337. this.currentColor = new Color( this.rSlider.getValue(), this.currentColor.getGreen(), this.currentColor.getBlue() );
  338. } else if( e.getSource() == this.gSlider && Integer.parseInt( this.gTextField.getText() ) != this.gSlider.getValue() ) {
  339. this.gTextField.setText( "" + this.gSlider.getValue() );
  340. this.currentColor = new Color( this.currentColor.getRed(), this.gSlider.getValue(), this.currentColor.getBlue() );
  341. } else if( e.getSource() == this.bSlider && Integer.parseInt( this.bTextField.getText() ) != this.bSlider.getValue() ) {
  342. this.bTextField.setText( "" + this.bSlider.getValue() );
  343. this.currentColor = new Color( this.currentColor.getRed(), this.currentColor.getGreen(), this.bSlider.getValue() );
  344.  
  345.  
  346. } else if( e.getSource() == this.ySlider && Integer.parseInt( this.yTextField.getText() ) != this.ySlider.getValue() ) {
  347. this.yTextField.setText( "" + this.ySlider.getValue() );
  348. this.currentColor = new Color( this.currentColor.getRed(), this.currentColor.getGreen(), this.currentColor.getBlue() );
  349. } else if( e.getSource() == this.uSlider && Integer.parseInt( this.uTextField.getText() ) != this.uSlider.getValue() ) {
  350. this.uTextField.setText( "" + this.uSlider.getValue() );
  351. } else if( e.getSource() == this.vSlider && Integer.parseInt( this.vTextField.getText() ) != this.vSlider.getValue() ) {
  352. this.vTextField.setText( "" + this.vSlider.getValue() );
  353.  
  354.  
  355. } else if( e.getSource() == this.cSlider && Integer.parseInt( this.cTextField.getText() ) != this.cSlider.getValue() ) {
  356. this.cTextField.setText( "" + this.cSlider.getValue() );
  357. } else if( e.getSource() == this.mSlider && Integer.parseInt( this.mTextField.getText() ) != this.mSlider.getValue() ) {
  358. this.mTextField.setText( "" + this.mSlider.getValue() );
  359. } else if( e.getSource() == this.y2Slider && Integer.parseInt( this.y2TextField.getText() ) != this.y2Slider.getValue() ) {
  360. this.y2TextField.setText( "" + this.y2Slider.getValue() );
  361. }
  362. this.colorCanvas.setBackground( this.currentColor );
  363. this.update();
  364. }
  365. }
  366.  
  367. /**
  368. * This method updates all other components if one component has changed.
  369. */
  370. private void update() {
  371. this.update = true;
  372. this.update = false;
  373. }
  374. }
  375.