1 package fr.ifremer.dali.ui.swing.util.plaf;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 import fr.ifremer.dali.service.DaliTechnicalException;
25
26 import javax.swing.*;
27 import javax.swing.plaf.nimbus.AbstractRegionPainter;
28 import javax.swing.plaf.nimbus.NimbusLookAndFeel;
29 import java.awt.Color;
30 import java.lang.reflect.Field;
31
32
33
34
35
36
37 public class PlafUtils {
38
39 public static void changeBackground(JComponent component, Color color) {
40
41 if (component instanceof JSpinner) {
42
43
44 if (isNimbusLAF()) {
45 UIDefaults defaults = new UIDefaults();
46 defaults.putAll(UIManager.getLookAndFeelDefaults());
47 Object painter = defaults.get("Spinner:Panel:\"Spinner.formattedTextField\"[Enabled].backgroundPainter");
48
49 if (painter instanceof AbstractRegionPainter) {
50 AbstractRegionPainter abstractRegionPainter = (AbstractRegionPainter) painter;
51
52 try {
53 Field contextField = abstractRegionPainter.getClass().getDeclaredField("ctx");
54 contextField.setAccessible(true);
55
56 SpinnerTextFieldPainter newEnabledPainter = new SpinnerTextFieldPainter(
57 contextField.get(abstractRegionPainter),
58 SpinnerTextFieldPainter.BACKGROUND_ENABLED,
59 color);
60
61 SpinnerTextFieldPainter newFocusedPainter = new SpinnerTextFieldPainter(
62 contextField.get(abstractRegionPainter),
63 SpinnerTextFieldPainter.BACKGROUND_FOCUSED,
64 color);
65
66 defaults.put("Spinner:Panel:\"Spinner.formattedTextField\"[Enabled].backgroundPainter", newEnabledPainter);
67 defaults.put("Spinner:Panel:\"Spinner.formattedTextField\"[Focused].backgroundPainter", newFocusedPainter);
68
69 JSpinner spinner = (JSpinner) component;
70 JTextField textField = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
71 textField.putClientProperty("Nimbus.Overrides", defaults);
72 textField.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
73 textField.updateUI();
74
75 } catch (NoSuchFieldException | IllegalAccessException e) {
76 throw new DaliTechnicalException(e);
77 }
78 }
79 }
80
81 } else if (component instanceof JComboBox) {
82
83
84 if (isNimbusLAF()) {
85 UIDefaults defaults = new UIDefaults();
86 defaults.putAll(UIManager.getLookAndFeelDefaults());
87 Object painter = defaults.get("ComboBox:\"ComboBox.textField\"[Enabled].backgroundPainter");
88
89 if (painter instanceof AbstractRegionPainter) {
90 AbstractRegionPainter abstractRegionPainter = (AbstractRegionPainter) painter;
91
92 try {
93 Field contextField = abstractRegionPainter.getClass().getDeclaredField("ctx");
94 contextField.setAccessible(true);
95
96 ComboBoxTextFieldPainter newEnabledPainter = new ComboBoxTextFieldPainter(
97 contextField.get(abstractRegionPainter),
98 ComboBoxTextFieldPainter.BACKGROUND_ENABLED,
99 color);
100
101 ComboBoxTextFieldPainter newSelectedPainter = new ComboBoxTextFieldPainter(
102 contextField.get(abstractRegionPainter),
103 ComboBoxTextFieldPainter.BACKGROUND_SELECTED,
104 color);
105
106 defaults.put("ComboBox:\"ComboBox.textField\"[Enabled].backgroundPainter", newEnabledPainter);
107 defaults.put("ComboBox:\"ComboBox.textField\"[Selected].backgroundPainter", newSelectedPainter);
108
109 JTextField textField = (JTextField) ((JComboBox) component).getEditor().getEditorComponent();
110 textField.putClientProperty("Nimbus.Overrides", defaults);
111 textField.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
112 textField.updateUI();
113
114 } catch (NoSuchFieldException | IllegalAccessException e) {
115 throw new DaliTechnicalException(e);
116 }
117 }
118 }
119
120 }
121
122 }
123
124 public static boolean isNimbusLAF() {
125 return UIManager.getLookAndFeel() instanceof NimbusLookAndFeel;
126 }
127 }