package io.github.rowak.nanoleafdesktop.ui.dialog.colorpicker; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; public class ColorEntry extends JPanel { private JTextField txtRgb; private JTextField txtHsb; private JTextField txtHex; public ColorEntry(Container contentPane) { initUI(contentPane); } public Color getColor() { String[] rgb = txtRgb.getText().replace(" ", "").split(","); return new Color(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2])); } public int[] getHSB() { String[] hsb = txtHsb.getText().replace(" ", "").split(","); int[] hsbVals = new int[3]; hsbVals[0] = Integer.parseInt(hsb[0]); hsbVals[1] = Integer.parseInt(hsb[1]); hsbVals[2] = Integer.parseInt(hsb[2]); return hsbVals; } public JTextField getRgbTextField() { return txtRgb; } public JTextField getHsbTextField() { return txtHsb; } public JTextField getHexTextField() { return txtHex; } private void initUI(Container contentPane) { JPanel panel = new JPanel(); panel.setBackground(Color.DARK_GRAY); contentPane.add(panel, "flowx, cell 0 1"); panel.setLayout(new MigLayout("", "[]", "[][][]")); JLabel lblRgb = new JLabel("RGB"); lblRgb.setForeground(Color.WHITE); lblRgb.setFont(new Font("Tahoma", Font.PLAIN, 20)); panel.add(lblRgb, "flowx,cell 0 0"); txtRgb = new JTextField(); txtRgb.setFont(new Font("Tahoma", Font.PLAIN, 20)); txtRgb.setForeground(Color.WHITE); txtRgb.setBackground(Color.DARK_GRAY); txtRgb.setText("128, 128, 128"); txtRgb.setColumns(10); txtRgb.setCaretColor(Color.WHITE); txtRgb.addKeyListener(new EnterColorListener(EnterColorListener.RGB)); panel.add(txtRgb, "cell 0 0,gapx 15 0"); JLabel lblHsb = new JLabel("HSB"); lblHsb.setForeground(Color.WHITE); lblHsb.setFont(new Font("Tahoma", Font.PLAIN, 20)); panel.add(lblHsb, "flowx,cell 0 1"); txtHsb = new JTextField(); txtHsb.setText("0, 0, 50"); txtHsb.setFont(new Font("Tahoma", Font.PLAIN, 20)); txtHsb.setForeground(Color.WHITE); txtHsb.setBackground(Color.DARK_GRAY); txtHsb.setColumns(10); txtHsb.setCaretColor(Color.WHITE); txtHsb.addKeyListener(new EnterColorListener(EnterColorListener.HSB)); panel.add(txtHsb, "cell 0 1,gapx 15 0,aligny top"); JLabel lblHex = new JLabel("HEX"); lblHex.setForeground(Color.WHITE); lblHex.setFont(new Font("Tahoma", Font.PLAIN, 20)); panel.add(lblHex, "flowx,cell 0 2"); txtHex = new JTextField(); txtHex.setForeground(Color.WHITE); txtHex.setText("#808080"); txtHex.setFont(new Font("Tahoma", Font.PLAIN, 20)); txtHex.setBackground(Color.DARK_GRAY); txtHex.setColumns(10); txtHex.setCaretColor(Color.WHITE); txtHex.addKeyListener(new EnterColorListener(EnterColorListener.HEX)); panel.add(txtHex, "cell 0 2,gapx 15 0"); } public void addChangeListener(ChangeListener listener) { listenerList.add(ChangeListener.class, listener); } public void removeChangeListener(ChangeListener listener) { listenerList.remove(ChangeListener.class, listener); } public ChangeListener[] getChangeListeners() { return listenerList.getListeners(ChangeListener.class); } protected void fireChangeListeners() { ChangeEvent event = new ChangeEvent(this); for (ChangeListener listener : getChangeListeners()) { listener.stateChanged(event); } } private class EnterColorListener extends KeyAdapter { public static final int RGB = 0; public static final int HSB = 1; public static final int HEX = 2; private int colorType; public EnterColorListener(int colorType) { this.colorType = colorType; } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { try { switch (colorType) { case RGB: String[] rgb = txtRgb.getText().replace(" ", "").split(","); Color c = new Color(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2])); updateColorValues(c); break; case HSB: String[] hsb = txtHsb.getText().replace(" ", "").split(","); c = Color.getHSBColor(Integer.parseInt(hsb[0])/360f, Integer.parseInt(hsb[1])/100f, Integer.parseInt(hsb[2])/100f); updateColorValues(c); break; case HEX: String hex = txtHex.getText(); c = Color.decode(hex); updateColorValues(c); break; } fireChangeListeners(); } catch (NumberFormatException nfe) { nfe.printStackTrace(); } } super.keyPressed(e); } private void updateColorValues(Color color) { String rgb = String.format("%d, %d, %d", color.getRed(), color.getGreen(), color.getBlue()); float[] hsbVals = new float[3]; hsbVals = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), hsbVals); String hsb = String.format("%d, %d, %d", (int)(hsbVals[0]*360), (int)(hsbVals[1]*100), (int)(hsbVals[2]*100)); String hex = String.format("#%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue()); txtRgb.setText(rgb); txtHsb.setText(hsb); txtHex.setText(hex); } } }