1 import java.awt.BorderLayout; 2 import java.awt.Color; 3 import java.awt.Dimension; 4 5 import javax.swing.Box; 6 import javax.swing.JCheckBox; 7 import javax.swing.JFrame; 8 import javax.swing.JLabel; 9 import javax.swing.JList; 10 import javax.swing.JPanel; 11 import javax.swing.JScrollBar; 12 import javax.swing.JScrollPane; 13 import javax.swing.JSlider; 14 import javax.swing.JTextArea; 15 import javax.swing.event.ChangeEvent; 16 import javax.swing.event.ChangeListener; 17 import javax.swing.event.ListSelectionEvent; 18 import javax.swing.event.ListSelectionListener; 19 20 21 public class ColorWindow { 22 23 private double[] rgb = new double[3]; 24 25 private JFrame frame; 26 private JPanel colorPanel; 27 private JTextArea rgbvalues; 28 private JTextArea rgbhexvalues; 29 private JSlider amountBar; 30 private JSlider brightnessBar; 31 private Box graphBox; 32 33 private double AMOUNT=0.5, BRIGHTNESS=0; 34 private Boolean GAMMA=false, MERGE=false; 35 private String SPECTRUMFILE="", PREV_SPECTRUMFILE=""; 36 private ColorCalculator cc = null; 37 ColorWindow()38 public ColorWindow(){ 39 40 initComponents(); 41 42 cc=new ColorCalculator(); 43 } 44 45 main(String args[])46 public static void main(String args[]){ 47 new ColorWindow(); 48 } 49 50 applyGamma(double c)51 private double applyGamma(double c){ 52 if (c>1) c=1; 53 54 double a = 0.055; 55 if (c<0.0031308) 56 c*=12.92; 57 else 58 c = (1+a) * Math.pow(c, 1/2.4) - a; 59 60 if (c>1) c=1; 61 62 return c; 63 } 64 65 initComponents()66 private void initComponents(){ 67 frame = new JFrame(); 68 frame.setLayout(new BorderLayout()); 69 70 JCheckBox gammayesno = new JCheckBox("Use Gamma Correction" , GAMMA); 71 gammayesno.addChangeListener(new ChangeListener() { 72 @Override 73 public void stateChanged(ChangeEvent e) { 74 GAMMA = ((JCheckBox)e.getSource()).isSelected(); 75 action_calculateColor(); 76 } 77 }); 78 79 JCheckBox merge = new JCheckBox("Merge graphs", MERGE); 80 merge.addChangeListener(new ChangeListener() { 81 @Override 82 public void stateChanged(ChangeEvent e) { 83 MERGE = ((JCheckBox)e.getSource()).isSelected(); 84 drawGraphs(true); 85 } 86 }); 87 88 Box toolsBox = Box.createHorizontalBox(); 89 toolsBox.add(gammayesno); 90 toolsBox.add(merge); 91 92 93 amountBar = new JSlider(0, 1000, 500); 94 amountBar.addChangeListener( 95 new ChangeListener() { 96 @Override 97 public void stateChanged(ChangeEvent e) { 98 JSlider source = (JSlider)e.getSource(); 99 if (!source.getValueIsAdjusting()) 100 AMOUNT = (double)(source.getModel().getValue())/1000; 101 action_calculateColor(); 102 } 103 }); 104 amountBar.setPaintLabels(true); 105 106 brightnessBar = new JSlider(JSlider.VERTICAL, -100,100,0); 107 brightnessBar.addChangeListener(new ChangeListener() { 108 @Override 109 public void stateChanged(ChangeEvent e) { 110 JSlider source = (JSlider)e.getSource(); 111 if (!source.getValueIsAdjusting()) 112 BRIGHTNESS = (double)(source.getModel().getValue())/1000; 113 action_calculateColor(); 114 } 115 }); 116 117 118 JList folderList = GUITools.getFolderList(null); 119 JPanel listPanel = new JPanel(); 120 // listPanel.setPreferredSize(new Dimension(120,500)); 121 listPanel.add(folderList); 122 folderList.addListSelectionListener( 123 new ListSelectionListener() { 124 @Override 125 public void valueChanged(ListSelectionEvent e) { 126 PREV_SPECTRUMFILE = SPECTRUMFILE; 127 SPECTRUMFILE = ((JList)e.getSource()).getSelectedValue().toString(); 128 action_calculateColor(); 129 } 130 }); 131 JScrollPane scroll = new JScrollPane(listPanel); 132 scroll.setAutoscrolls(true); 133 scroll.setPreferredSize(new Dimension(125,500)); 134 135 Box amBox = Box.createHorizontalBox(); 136 amBox.add(new JLabel("Amount")); 137 amBox.add(amountBar); 138 139 Box rightBox = Box.createVerticalBox(); 140 rgbvalues = new JTextArea(); 141 rgbhexvalues = new JTextArea(); 142 143 rightBox.add(rgbvalues); 144 rightBox.add(rgbhexvalues); 145 colorPanel = new JPanel(); 146 colorPanel.setMinimumSize(new Dimension(100,100)); 147 colorPanel.setPreferredSize(new Dimension(150,400)); 148 rightBox.add(colorPanel); 149 150 graphBox = Box.createVerticalBox(); 151 152 frame.setMinimumSize(new Dimension(600,400)); 153 frame.getContentPane().add(rightBox, BorderLayout.EAST); 154 frame.getContentPane().add(toolsBox, BorderLayout.NORTH); 155 frame.getContentPane().add(graphBox, BorderLayout.CENTER); 156 frame.getContentPane().add(amBox, BorderLayout.SOUTH); 157 // frame.getContentPane().add(brightnessBar, BorderLayout.WEST); 158 // frame.getContentPane().add(listPanel, BorderLayout.WEST); 159 frame.getContentPane().add(scroll, BorderLayout.WEST); 160 161 frame.setTitle("Color viewer version 5"); 162 163 frame.pack(); 164 frame.setVisible(true); 165 166 167 168 } 169 170 action_calculateColor()171 private void action_calculateColor(){ 172 173 if(!SPECTRUMFILE.equals(PREV_SPECTRUMFILE)){ 174 cc.loadAbsorbSpectrum(SPECTRUMFILE); 175 } 176 177 rgb = cc.calculateIlluminatedColor(AMOUNT, BRIGHTNESS); 178 179 System.out.println("Amount: "+AMOUNT+" , BRIGHTNESS: "+BRIGHTNESS+" GAMMA correction: "+GAMMA); 180 181 if(GAMMA) 182 for (int i=0; i<3; i++) 183 rgb[i] = applyGamma(rgb[i]); 184 185 // when transforming from XYZ to RGB some values can be negative or greater than 1 186 // this means the color cannot be exactly represented in RGB space 187 for (int i=0;i<rgb.length;i++){ 188 if(rgb[i]<0) 189 rgb[i]=0.0; 190 if(rgb[i]>1) 191 rgb[i]=1.0; 192 } 193 194 Color color = new Color ((float)rgb[0], (float)rgb[1], (float)rgb[2]); 195 colorPanel.setBackground(color); 196 rgbvalues.setText("RGB: "+ color.getRed() + " " + color.getGreen() + " " + color.getBlue()); 197 rgbhexvalues.setText("RGB: #"+ Integer.toHexString(color.getRed()).toUpperCase() + Integer.toHexString(color.getGreen()).toUpperCase() + Integer.toHexString(color.getBlue()).toUpperCase() ); 198 199 drawGraphs(false); 200 201 frame.validate(); 202 } 203 204 drawGraphs(Boolean validate)205 private void drawGraphs(Boolean validate){ 206 graphBox.removeAll(); 207 if (MERGE){ 208 graphBox.add(cc.createGraph()); 209 } else { 210 graphBox.add(cc.createAbsorbptionGraph()); 211 graphBox.add(cc.createResultLightGraph()); 212 } 213 214 if(validate) 215 frame.validate(); 216 } 217 218 219 } 220