View Javadoc
1   package edu.jiangxin.apktoolbox.convert.color;
2   
3   import edu.jiangxin.apktoolbox.convert.color.colortable.IColorTable;
4   import edu.jiangxin.apktoolbox.convert.color.colortable.OrdinaryColorTable;
5   import edu.jiangxin.apktoolbox.convert.color.colortable.RalColorTable;
6   import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
7   import edu.jiangxin.apktoolbox.utils.Constants;
8   
9   import javax.swing.*;
10  import javax.swing.event.ChangeEvent;
11  import javax.swing.event.ChangeListener;
12  import javax.swing.event.DocumentEvent;
13  import javax.swing.event.DocumentListener;
14  import javax.swing.table.DefaultTableCellRenderer;
15  import javax.swing.table.DefaultTableModel;
16  import java.awt.*;
17  import java.io.Serial;
18  
19  public class ColorConvertPanel extends EasyPanel {
20      @Serial
21      private static final long serialVersionUID = 1L;
22  
23      private Color color;
24  
25      private JSpinner redSpinner;
26  
27      private JSpinner greenInRgbSpinner;
28  
29      private JSpinner blueInRgbSpinner;
30  
31      private JTextField hexInRgbTextField;
32  
33      private JSpinner hueInHsbSpinner;
34  
35      private JSpinner saturationInHsbSpinner;
36  
37      private JSpinner brightnessInHsbSpinner;
38  
39      private JSpinner hueInHslSpinner;
40  
41      private JSpinner saturationInHslSpinner;
42  
43      private JSpinner lightnessInHslSpinner;
44  
45      private JSpinner cyanInCmykSpinner;
46  
47      private JSpinner magentaInCmykSpinner;
48  
49      private JSpinner yellowInCmykSpinner;
50  
51      private JSpinner blackInCmykSpinner;
52  
53      private JSpinner lInCielabSpinner;
54  
55      private JSpinner aInCielabSpinner;
56  
57      private JSpinner bInCielabSpinner;
58  
59      private JTextField colorBoxTextField;
60  
61      private JComboBox<IColorTable> colorTableTypeComboBox;
62  
63      private JTable colorTable;
64  
65      private boolean isChangedByUser = true;
66  
67      public ColorConvertPanel() throws HeadlessException {
68          super();
69      }
70  
71      @Override
72      public void initUI() {
73          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
74          createColorBoxPanel();
75  
76          BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
77          setLayout(boxLayout);
78  
79          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
80          createRgbPanel();
81  
82          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
83          createHsbPanel();
84  
85          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
86          createHslPanel();
87  
88          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
89          createCmykPanel();
90  
91          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
92          createCielabPanel();
93  
94          add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
95          createColorTablePanel();
96      }
97  
98      public void createColorBoxPanel() {
99          JPanel colorBoxPanel = new JPanel();
100         add(colorBoxPanel);
101         colorBoxPanel.setLayout(new BorderLayout());
102         colorBoxPanel.setBorder(BorderFactory.createTitledBorder("Color Box"));
103 
104         JPanel xPanel = new JPanel();
105         colorBoxPanel.add(xPanel);
106         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
107 
108         colorBoxTextField = new JTextField();
109         colorBoxTextField.setEditable(false);
110         colorBoxTextField.setOpaque(false);
111 
112         xPanel.add(colorBoxTextField);
113     }
114 
115     private void createRgbPanel() {
116         JPanel rgbPanel = new JPanel();
117         add(rgbPanel);
118         rgbPanel.setLayout(new BorderLayout());
119         rgbPanel.setBorder(BorderFactory.createTitledBorder("RGB"));
120 
121         JPanel xPanel = new JPanel();
122         rgbPanel.add(xPanel);
123         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
124 
125         JLabel rebLabel = new JLabel("R(Red, [0-255])");
126         redSpinner = new JSpinner();
127         redSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
128         redSpinner.addChangeListener(new RgbChangeListener());
129 
130         JLabel greenLabel = new JLabel("G(Green, [0-255])");
131         greenInRgbSpinner = new JSpinner();
132         greenInRgbSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
133         greenInRgbSpinner.addChangeListener(new RgbChangeListener());
134 
135         JLabel blueLabel = new JLabel("B(Blue, [0-255])");
136         blueInRgbSpinner = new JSpinner();
137         blueInRgbSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
138         blueInRgbSpinner.addChangeListener(new RgbChangeListener());
139 
140         JLabel hexLabel = new JLabel("Hex");
141         hexInRgbTextField = new JTextField();
142         hexInRgbTextField.setToolTipText("0xFFFFFF格式常用在通用语言中(Java/C++等), #FFFFFF格式常用在标记语言中(XML/HTML等)");
143         hexInRgbTextField.setEditable(true);
144         hexInRgbTextField.getDocument().addDocumentListener(new HexDocumentListener());
145 
146         xPanel.add(rebLabel);
147         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
148         xPanel.add(redSpinner);
149         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
150         xPanel.add(greenLabel);
151         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
152         xPanel.add(greenInRgbSpinner);
153         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
154         xPanel.add(blueLabel);
155         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
156         xPanel.add(blueInRgbSpinner);
157         xPanel.add(Box.createHorizontalStrut(3 * Constants.DEFAULT_X_BORDER));
158         xPanel.add(hexLabel);
159         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
160         xPanel.add(hexInRgbTextField);
161     }
162 
163     private void createHsbPanel() {
164         JPanel hsbPanel = new JPanel();
165         add(hsbPanel);
166         hsbPanel.setLayout(new BorderLayout());
167         hsbPanel.setBorder(BorderFactory.createTitledBorder("HSB/HSV"));
168 
169         JPanel xPanel = new JPanel();
170         hsbPanel.add(xPanel);
171         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
172 
173         JLabel hueLabel = new JLabel("H(Hue, [0-360])");
174         hueInHsbSpinner = new JSpinner();
175         hueInHsbSpinner.setModel(new SpinnerNumberModel(0, 0, 360, 1));
176         hueInHsbSpinner.addChangeListener(new HsbChangeListener());
177 
178         JLabel saturationLabel = new JLabel("S(Saturation, [0-100])");
179         saturationInHsbSpinner = new JSpinner();
180         saturationInHsbSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
181         saturationInHsbSpinner.addChangeListener(new HsbChangeListener());
182 
183 
184         JLabel brightnessLabel = new JLabel("B/V(Brightness/Value, [0-100])");
185         brightnessInHsbSpinner = new JSpinner();
186         brightnessInHsbSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
187         brightnessInHsbSpinner.addChangeListener(new HsbChangeListener());
188 
189         xPanel.add(hueLabel);
190         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
191         xPanel.add(hueInHsbSpinner);
192         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
193         xPanel.add(saturationLabel);
194         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
195         xPanel.add(saturationInHsbSpinner);
196         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
197         xPanel.add(brightnessLabel);
198         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
199         xPanel.add(brightnessInHsbSpinner);
200     }
201 
202     private void createHslPanel() {
203         JPanel hslPanel = new JPanel();
204         add(hslPanel);
205         hslPanel.setLayout(new BorderLayout());
206         hslPanel.setBorder(BorderFactory.createTitledBorder("HSL"));
207 
208         JPanel xPanel = new JPanel();
209         hslPanel.add(xPanel);
210         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
211 
212         JLabel hueLabel = new JLabel("H(Hue, [0-360])");
213         hueInHslSpinner = new JSpinner();
214         hueInHslSpinner.setModel(new SpinnerNumberModel(0, 0, 360, 1));
215         hueInHslSpinner.addChangeListener(new HslChangeListener());
216 
217         JLabel saturationLabel = new JLabel("S(Saturation, [0-100])");
218         saturationInHslSpinner = new JSpinner();
219         saturationInHslSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
220         saturationInHslSpinner.addChangeListener(new HslChangeListener());
221 
222 
223         JLabel lightnessLabel = new JLabel("L(Lightness, [0-100])");
224         lightnessInHslSpinner = new JSpinner();
225         lightnessInHslSpinner.setModel(new SpinnerNumberModel(50, 0, 100, 1));
226         lightnessInHslSpinner.addChangeListener(new HslChangeListener());
227 
228         xPanel.add(hueLabel);
229         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
230         xPanel.add(hueInHslSpinner);
231         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
232         xPanel.add(saturationLabel);
233         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
234         xPanel.add(saturationInHslSpinner);
235         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
236         xPanel.add(lightnessLabel);
237         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
238         xPanel.add(lightnessInHslSpinner);
239     }
240 
241     private void createCmykPanel() {
242         JPanel cmykPanel = new JPanel();
243         add(cmykPanel);
244         cmykPanel.setLayout(new BorderLayout());
245         cmykPanel.setBorder(BorderFactory.createTitledBorder("CMYK"));
246 
247         JPanel xPanel = new JPanel();
248         cmykPanel.add(xPanel);
249         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
250 
251         JLabel cyanLabel = new JLabel("C(Cyan, [0-100])");
252         cyanInCmykSpinner = new JSpinner();
253         cyanInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
254         cyanInCmykSpinner.addChangeListener(new CmykChangeListener());
255 
256         JLabel magentaLabel = new JLabel("M(Magenta, [0-100])");
257         magentaInCmykSpinner = new JSpinner();
258         magentaInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
259         magentaInCmykSpinner.addChangeListener(new CmykChangeListener());
260 
261 
262         JLabel yellowLabel = new JLabel("Y(Yellow, [0-100])");
263         yellowInCmykSpinner = new JSpinner();
264         yellowInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
265         yellowInCmykSpinner.addChangeListener(new CmykChangeListener());
266 
267         JLabel blackLabel = new JLabel("K(Black, [0-100])");
268         blackInCmykSpinner = new JSpinner();
269         blackInCmykSpinner.setModel(new SpinnerNumberModel(0, 0, 100, 1));
270         blackInCmykSpinner.addChangeListener(new CmykChangeListener());
271 
272         xPanel.add(cyanLabel);
273         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
274         xPanel.add(cyanInCmykSpinner);
275         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
276         xPanel.add(magentaLabel);
277         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
278         xPanel.add(magentaInCmykSpinner);
279         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
280         xPanel.add(yellowLabel);
281         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
282         xPanel.add(yellowInCmykSpinner);
283         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
284         xPanel.add(blackLabel);
285         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
286         xPanel.add(blackInCmykSpinner);
287     }
288 
289     private void createCielabPanel() {
290         JPanel cielabPanel = new JPanel();
291         add(cielabPanel);
292         cielabPanel.setLayout(new BorderLayout());
293         cielabPanel.setBorder(BorderFactory.createTitledBorder("CIELAB"));
294 
295         JPanel xPanel = new JPanel();
296         cielabPanel.add(xPanel);
297         xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
298 
299         JLabel lLabel = new JLabel("L([0-100])");
300         lInCielabSpinner = new JSpinner();
301         lInCielabSpinner.setModel(new SpinnerNumberModel(50, 0, 100, 1));
302         lInCielabSpinner.addChangeListener(new CielabChangeListener());
303 
304         JLabel magentaLabel = new JLabel("A([-128-127])");
305         aInCielabSpinner = new JSpinner();
306         aInCielabSpinner.setModel(new SpinnerNumberModel(0, -128, 127, 1));
307         aInCielabSpinner.addChangeListener(new CielabChangeListener());
308 
309 
310         JLabel yellowLabel = new JLabel("B([-128-127])");
311         bInCielabSpinner = new JSpinner();
312         bInCielabSpinner.setModel(new SpinnerNumberModel(0, -128, 127, 1));
313         bInCielabSpinner.addChangeListener(new CielabChangeListener());
314 
315         xPanel.add(lLabel);
316         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
317         xPanel.add(lInCielabSpinner);
318         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
319         xPanel.add(magentaLabel);
320         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
321         xPanel.add(aInCielabSpinner);
322         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
323         xPanel.add(yellowLabel);
324         xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
325         xPanel.add(bInCielabSpinner);
326     }
327 
328     private void createColorTablePanel() {
329         JPanel colorTablePanel = new JPanel();
330         add(colorTablePanel);
331         colorTablePanel.setLayout(new BorderLayout());
332         colorTablePanel.setBorder(BorderFactory.createTitledBorder("Color Table"));
333 
334         JPanel yPanel = new JPanel();
335         colorTablePanel.add(yPanel);
336         yPanel.setLayout(new BoxLayout(yPanel, BoxLayout.Y_AXIS));
337 
338         colorTableTypeComboBox = new JComboBox<>();
339         IColorTable ordinaryColorTable = new OrdinaryColorTable();
340         IColorTable ralColorTable = new RalColorTable();
341         colorTableTypeComboBox.addItem(ordinaryColorTable);
342         colorTableTypeComboBox.addItem(ralColorTable);
343         colorTableTypeComboBox.setSelectedItem(ordinaryColorTable);
344         colorTableTypeComboBox.addItemListener(itemEvent -> {
345             ColorDefaultTableModel model = (ColorDefaultTableModel) colorTable.getModel();
346             IColorTable selectedColorTable = (IColorTable) itemEvent.getItem();
347             model.setDataVector(selectedColorTable.getTableRowData(), selectedColorTable.getColumnNames());
348             onColorTableChanged();
349         });
350 
351         IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
352         colorTable = new JTable(new ColorDefaultTableModel(selectedColorTable.getTableRowData(), selectedColorTable.getColumnNames()));
353         JScrollPane colorTableScrollPane = new JScrollPane(colorTable);
354         onColorTableChanged();
355 
356         yPanel.add(colorTableTypeComboBox);
357         yPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
358         yPanel.add(colorTableScrollPane);
359     }
360 
361     private void onColorTableChanged() {
362         IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
363         int labelIndex = selectedColorTable.getLabelIndex();
364         String labelName = colorTable.getColumnName(labelIndex);
365         colorTable.getColumn(labelName).setCellRenderer(new ColorTableCellRenderer());
366     }
367 
368     private class ColorDefaultTableModel extends DefaultTableModel {
369         @Serial
370         private static final long serialVersionUID = 1L;
371 
372         public ColorDefaultTableModel(Object[][] data, Object[] columnNames) {
373             super(data, columnNames);
374         }
375 
376         @Override
377         public boolean isCellEditable(int row, int column) {
378             return true;
379         }
380     }
381 
382     private class ColorTableCellRenderer extends DefaultTableCellRenderer {
383         @Serial
384         private static final long serialVersionUID = 1L;
385 
386         @Override
387         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
388             Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
389             IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
390             if (selectedColorTable == null) {
391                 return renderer;
392             }
393             String hex = (String) colorTable.getValueAt(row, selectedColorTable.getHexIndex());
394             Color color = ColorUtils.hex2Color(hex);
395             renderer.setBackground(color);
396             return renderer;
397         }
398     }
399 
400     private void syncToOthersFormat(String colorMode) {
401         if (!colorMode.equalsIgnoreCase("RGB")) {
402             redSpinner.setValue(color.getRed());
403             greenInRgbSpinner.setValue(color.getGreen());
404             blueInRgbSpinner.setValue(color.getBlue());
405         }
406         if (!colorMode.equalsIgnoreCase("HEX")) {
407             hexInRgbTextField.setText(ColorUtils.color2Hex(color));
408         }
409         if (!colorMode.equalsIgnoreCase("HSB")) {
410             int[] hsbArray = ColorUtils.color2Hsb(color);
411             hueInHsbSpinner.setValue(hsbArray[0]);
412             saturationInHsbSpinner.setValue(hsbArray[1]);
413             brightnessInHsbSpinner.setValue(hsbArray[2]);
414         }
415         if (!colorMode.equalsIgnoreCase("HSL")) {
416             int[] hsbArray = ColorUtils.color2Hsl(color);
417             hueInHslSpinner.setValue(hsbArray[0]);
418             saturationInHslSpinner.setValue(hsbArray[1]);
419             lightnessInHslSpinner.setValue(hsbArray[2]);
420         }
421         if (!colorMode.equalsIgnoreCase("CMYK")) {
422             int[] cmykArray = ColorUtils.color2Cmyk(color);
423             cyanInCmykSpinner.setValue(cmykArray[0]);
424             magentaInCmykSpinner.setValue(cmykArray[1]);
425             yellowInCmykSpinner.setValue(cmykArray[2]);
426             blackInCmykSpinner.setValue(cmykArray[3]);
427         }
428         if (!colorMode.equalsIgnoreCase("CIELAB")) {
429             int[] cielabArray = ColorUtils.color2Cielab(color);
430             lInCielabSpinner.setValue(cielabArray[0]);
431             aInCielabSpinner.setValue(cielabArray[1]);
432             bInCielabSpinner.setValue(cielabArray[2]);
433         }
434         colorBoxTextField.setBackground(color);
435         //paint the color box with the converted output color
436         colorBoxTextField.setOpaque(true);
437     }
438 
439     class RgbChangeListener implements ChangeListener {
440         @Override
441         public void stateChanged(ChangeEvent e) {
442             if (!isChangedByUser) {
443                 return;
444             }
445             isChangedByUser = false;
446             int red = (Integer) redSpinner.getValue();
447             int green = (Integer) greenInRgbSpinner.getValue();
448             int blue = (Integer) blueInRgbSpinner.getValue();
449             color = new Color(red, green, blue);
450             syncToOthersFormat("RGB");
451             isChangedByUser = true;
452         }
453     }
454 
455     class HsbChangeListener implements ChangeListener {
456         @Override
457         public void stateChanged(ChangeEvent e) {
458             if (!isChangedByUser) {
459                 return;
460             }
461             isChangedByUser = false;
462             int hue = (Integer) hueInHsbSpinner.getValue();
463             int saturation = (Integer) saturationInHsbSpinner.getValue();
464             int brightness = (Integer) brightnessInHsbSpinner.getValue();
465             color = ColorUtils.hsb2Color(hue, saturation, brightness);
466             syncToOthersFormat("HSB");
467             isChangedByUser = true;
468         }
469     }
470 
471     class HslChangeListener implements ChangeListener {
472         @Override
473         public void stateChanged(ChangeEvent e) {
474             if (!isChangedByUser) {
475                 return;
476             }
477             isChangedByUser = false;
478             int hue = (Integer) hueInHslSpinner.getValue();
479             int saturation = (Integer) saturationInHslSpinner.getValue();
480             int lightness = (Integer) lightnessInHslSpinner.getValue();
481             color = ColorUtils.hsl2Color(hue, saturation, lightness);
482             syncToOthersFormat("HSL");
483             isChangedByUser = true;
484         }
485     }
486 
487     class CmykChangeListener implements ChangeListener {
488         @Override
489         public void stateChanged(ChangeEvent e) {
490             if (!isChangedByUser) {
491                 return;
492             }
493             isChangedByUser = false;
494             int cyan = (Integer) cyanInCmykSpinner.getValue();
495             int magenta = (Integer) magentaInCmykSpinner.getValue();
496             int yellow = (Integer) yellowInCmykSpinner.getValue();
497             int black = (Integer) blackInCmykSpinner.getValue();
498             color = ColorUtils.cmyk2Color(cyan, magenta, yellow, black);
499             syncToOthersFormat("CMYK");
500             isChangedByUser = true;
501         }
502     }
503 
504     class CielabChangeListener implements ChangeListener {
505         @Override
506         public void stateChanged(ChangeEvent e) {
507             if (!isChangedByUser) {
508                 return;
509             }
510             isChangedByUser = false;
511             int l = (Integer) lInCielabSpinner.getValue();
512             int a = (Integer) aInCielabSpinner.getValue();
513             int b = (Integer) bInCielabSpinner.getValue();
514             color = ColorUtils.cielab2Color(l, a, b);
515             syncToOthersFormat("CIELAB");
516             isChangedByUser = true;
517         }
518     }
519 
520     class HexDocumentListener implements DocumentListener {
521         @Override
522         public void insertUpdate(DocumentEvent e) {
523             onValueUpdate();
524         }
525 
526         @Override
527         public void removeUpdate(DocumentEvent e) {
528             onValueUpdate();
529         }
530 
531         @Override
532         public void changedUpdate(DocumentEvent e) {
533             onValueUpdate();
534         }
535 
536         private void onValueUpdate() {
537             if (!isChangedByUser) {
538                 return;
539             }
540             isChangedByUser = false;
541             String hex = hexInRgbTextField.getText();
542             try {
543                 color = ColorUtils.hex2Color(hex);
544                 syncToOthersFormat("HEX");
545             } catch (NumberFormatException e) {
546                 logger.error("Invalid hex value: {}", hex);
547             }
548             isChangedByUser = true;
549         }
550     }
551 }