diff --git a/swing/src/net/sf/openrocket/gui/components/StageSelector.java b/swing/src/net/sf/openrocket/gui/components/StageSelector.java index f5972ad28..0658f3084 100644 --- a/swing/src/net/sf/openrocket/gui/components/StageSelector.java +++ b/swing/src/net/sf/openrocket/gui/components/StageSelector.java @@ -10,6 +10,7 @@ import javax.swing.JPanel; import javax.swing.JToggleButton; import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.gui.widgets.SelectColorToggleButton; import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.FlightConfiguration; @@ -36,7 +37,7 @@ public class StageSelector extends JPanel implements StateChangeListener { buttons.clear(); this.removeAll(); for(AxialStage stage : configuration.getRocket().getStageList()){ - JToggleButton button = new JToggleButton(new StageAction(stage)); + JToggleButton button = new SelectColorToggleButton(new StageAction(stage)); button.setSelected(configuration.isStageActive(stage.getStageNumber())); this.add(button); buttons.add(button); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java index 700546742..a5d11148c 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java @@ -52,6 +52,7 @@ import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.scalefigure.RocketPanel; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.widgets.SelectColorToggleButton; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.masscalc.CMAnalysisEntry; import net.sf.openrocket.masscalc.MassCalculator; @@ -124,7 +125,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe BasicSlider slider = new BasicSlider(theta.getSliderModel(0, 2 * Math.PI)); panel.add(slider, "growx, split 2"); //// Worst button - worstToggle = new JToggleButton(trans.get("componentanalysisdlg.ToggleBut.worst")); + worstToggle = new SelectColorToggleButton(trans.get("componentanalysisdlg.ToggleBut.worst")); worstToggle.setSelected(true); worstToggle.addActionListener(new ActionListener() { @Override diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index 1377c5a32..8d4eccd2f 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -73,6 +73,7 @@ import net.sf.openrocket.gui.scalefigure.RocketFigure; import net.sf.openrocket.gui.scalefigure.ScaleScrollPane; import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.widgets.SelectColorToggleButton; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.Markers; @@ -88,7 +89,6 @@ import net.sf.openrocket.optimization.rocketoptimization.goals.MaximizationGoal; import net.sf.openrocket.optimization.rocketoptimization.goals.MinimizationGoal; import net.sf.openrocket.optimization.rocketoptimization.goals.ValueSeekGoal; import net.sf.openrocket.optimization.services.OptimizationServiceHelper; -import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -527,7 +527,7 @@ public class GeneralOptimizationDialog extends JDialog { // // Start/Stop button - startButton = new JToggleButton(START_TEXT); + startButton = new SelectColorToggleButton(START_TEXT); startButton.addActionListener(e -> { if (updating) { log.debug("Updating, ignoring event"); diff --git a/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java new file mode 100644 index 000000000..b2fc4bea2 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/widgets/SelectColorToggleButton.java @@ -0,0 +1,51 @@ +package net.sf.openrocket.gui.widgets; + +import net.sf.openrocket.gui.components.StageSelector; + +import javax.swing.*; +import java.awt.Graphics; +import java.awt.Color; + +public class SelectColorToggleButton extends JToggleButton { + public SelectColorToggleButton(Action a) { + super(a); + } + + public SelectColorToggleButton(String text) { + super(text); + } + + public SelectColorToggleButton() { + } + + public SelectColorToggleButton(Icon icon) { + super(icon); + } + + public SelectColorToggleButton(Icon icon, boolean selected) { + super(icon, selected); + } + + public SelectColorToggleButton(String text, boolean selected) { + super(text, selected); + } + + public SelectColorToggleButton(String text, Icon icon) { + super(text, icon); + } + + public SelectColorToggleButton(String text, Icon icon, boolean selected) { + super(text, icon, selected); + } + + @Override + public void paint(Graphics g) { + if (isSelected()) { + setForeground(UIManager.getColor("ToggleButton.selectForeground")); + } + else { + setForeground(UIManager.getColor("ToggleButton.foreground")); + } + super.paint(g); + } +} diff --git a/swing/src/net/sf/openrocket/startup/OSXSetup.java b/swing/src/net/sf/openrocket/startup/OSXSetup.java index 3ca0a20f4..614d50c8a 100644 --- a/swing/src/net/sf/openrocket/startup/OSXSetup.java +++ b/swing/src/net/sf/openrocket/startup/OSXSetup.java @@ -93,6 +93,9 @@ final class OSXSetup { // Set the foreground of active tabs to black; there was a bug where you had a white background and white foreground UIManager.put("TabbedPane.foreground", Color.black); + // Set the select foreground for buttons to not be black on a blue background + UIManager.put("ToggleButton.selectForeground", Color.WHITE); + } catch (final Throwable t) { // None of the preceding is critical to the app, // so at worst case log an error and continue