From 2f6a8c8db94c80c5a57ef381db34d97c98fbd50f Mon Sep 17 00:00:00 2001 From: Sibo Van Gool Date: Tue, 10 Aug 2021 19:35:34 +0200 Subject: [PATCH 1/2] [fixes #989] Use changelistener for foreground change + don't change on non OSX-devices --- .../gui/widgets/SelectColorButton.java | 33 +++++++++++------ .../gui/widgets/SelectColorToggleButton.java | 37 ++++++++++++++----- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java b/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java index 4ad1243d4..5881cdefb 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java @@ -5,38 +5,49 @@ import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.Graphics; public class SelectColorButton extends JButton { public SelectColorButton() { + addChangeListenerSelectColor(); } public SelectColorButton(Icon icon) { super(icon); + addChangeListenerSelectColor(); } public SelectColorButton(String text) { super(text); + addChangeListenerSelectColor(); } public SelectColorButton(Action a) { super(a); + addChangeListenerSelectColor(); } public SelectColorButton(String text, Icon icon) { super(text, icon); + addChangeListenerSelectColor(); } - - - @Override - public void paint(Graphics g) { - if (getModel().isArmed()) { - setForeground(UIManager.getColor("Button.selectForeground")); - } - else { - setForeground(UIManager.getColor("Button.foreground")); - } - super.paint(g); + private void addChangeListenerSelectColor() { + addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (UIManager.getColor("Button.selectForeground") == null + || UIManager.getColor("Button.foreground") == null) + return; + if (getModel().isArmed()) { + setForeground(UIManager.getColor("Button.selectForeground")); + } + else { + setForeground(UIManager.getColor("Button.foreground")); + } + } + }); } } diff --git a/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java index 96f2cceaa..970b8b15d 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java @@ -4,7 +4,12 @@ import javax.swing.JToggleButton; import javax.swing.Action; import javax.swing.Icon; import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; /** * This class is a replacement for the standard JToggleButton. Its purpose is to be able @@ -15,43 +20,57 @@ import java.awt.Graphics; public class SelectColorToggleButton extends JToggleButton { public SelectColorToggleButton(Action a) { super(a); + addChangeListenerSelectColor(); } public SelectColorToggleButton(String text) { super(text); + addChangeListenerSelectColor(); } public SelectColorToggleButton() { + addChangeListenerSelectColor(); } public SelectColorToggleButton(Icon icon) { super(icon); + addChangeListenerSelectColor(); } public SelectColorToggleButton(Icon icon, boolean selected) { super(icon, selected); + addChangeListenerSelectColor(); } public SelectColorToggleButton(String text, boolean selected) { super(text, selected); + addChangeListenerSelectColor(); } public SelectColorToggleButton(String text, Icon icon) { super(text, icon); + addChangeListenerSelectColor(); } public SelectColorToggleButton(String text, Icon icon, boolean selected) { super(text, icon, selected); + addChangeListenerSelectColor(); } - @Override - public void paint(Graphics g) { - if (isSelected()) { - setForeground(UIManager.getColor("ToggleButton.selectForeground")); - } - else { - setForeground(UIManager.getColor("ToggleButton.foreground")); - } - super.paint(g); + private void addChangeListenerSelectColor() { + addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (UIManager.getColor("ToggleButton.selectForeground") == null + || UIManager.getColor("ToggleButton.foreground") == null) + return; + if (isSelected()) { + setForeground(UIManager.getColor("ToggleButton.selectForeground")); + } + else { + setForeground(UIManager.getColor("ToggleButton.foreground")); + } + } + }); } } From 716e723a537b23a19d5e2a02eeedd15803142dc2 Mon Sep 17 00:00:00 2001 From: Sibo Van Gool Date: Thu, 12 Aug 2021 14:17:15 +0200 Subject: [PATCH 2/2] [fixes #989] Fix toggleButton going 'blank' upon window out of focus --- .../gui/widgets/SelectColorButton.java | 6 +-- .../gui/widgets/SelectColorToggleButton.java | 39 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java b/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java index 5881cdefb..5fd39f611 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SelectColorButton.java @@ -35,12 +35,12 @@ public class SelectColorButton extends JButton { } private void addChangeListenerSelectColor() { + if (UIManager.getColor("Button.selectForeground") == null + || UIManager.getColor("Button.foreground") == null) + return; addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - if (UIManager.getColor("Button.selectForeground") == null - || UIManager.getColor("Button.foreground") == null) - return; if (getModel().isArmed()) { setForeground(UIManager.getColor("Button.selectForeground")); } diff --git a/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java index 970b8b15d..3b7ada39e 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java @@ -4,12 +4,8 @@ import javax.swing.JToggleButton; import javax.swing.Action; import javax.swing.Icon; import javax.swing.UIManager; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.Graphics; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; /** * This class is a replacement for the standard JToggleButton. Its purpose is to be able @@ -57,13 +53,34 @@ public class SelectColorToggleButton extends JToggleButton { addChangeListenerSelectColor(); } + /** + * This method sets the foreground color of the button. If the button is selected, then the selectForeground is used. + * If the frame that the button is in goes out of focus or if the button is unselected, then the foreground is used. + * + * This is to fix an issue on OSX devices where the foreground color would be black on blue (hardly readable) + */ private void addChangeListenerSelectColor() { - addChangeListener(new ChangeListener() { + if (UIManager.getColor("ToggleButton.selectForeground") == null + || UIManager.getColor("ToggleButton.foreground") == null) + return; + + // Case: frame goes out of focus + addPropertyChangeListener("Frame.active", new PropertyChangeListener() { @Override - public void stateChanged(ChangeEvent e) { - if (UIManager.getColor("ToggleButton.selectForeground") == null - || UIManager.getColor("ToggleButton.foreground") == null) - return; + public void propertyChange(PropertyChangeEvent evt) { + if (isSelected() && (boolean)evt.getNewValue()) { + setForeground(UIManager.getColor("ToggleButton.selectForeground")); + } + else { + setForeground(UIManager.getColor("ToggleButton.foreground")); + } + } + }); + + // Case: button is clicked + addPropertyChangeListener("ancestor", new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { if (isSelected()) { setForeground(UIManager.getColor("ToggleButton.selectForeground")); }