View Javadoc
1   package fr.ifremer.dali.ui.swing.util.plaf;
2   
3   /*-
4    * #%L
5    * Dali :: UI
6    * %%
7    * Copyright (C) 2014 - 2017 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Affero General Public License as published by
11   * the Free Software Foundation, either version 3 of the License, or
12   * (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU Affero General Public License
20   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21   * #L%
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   * platform look&feel util class
34   *
35   * @author peck7 on 20/10/2017.
36   */
37  public class PlafUtils {
38  
39      public static void changeBackground(JComponent component, Color color) {
40  
41          if (component instanceof JSpinner) {
42  
43              // get painter
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                      // get paint context by reflexion
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              // get painter
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                      // get paint context by reflexion
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 }