OptionPane:

- fixed background, which was wrong when OptionPane.background is different to Panel.background (e.g. in Hiberbee or Solarized themes)
- use non-UIResource borders in sub-panels to avoid that they are replaced when switching LaF
This commit is contained in:
Karl Tauber
2019-11-18 12:28:18 +01:00
parent 6ba1a419bc
commit 84db2f9b65
2 changed files with 65 additions and 0 deletions

View File

@@ -19,10 +19,15 @@ package com.formdev.flatlaf.ui;
import java.awt.Component; import java.awt.Component;
import java.awt.Container; import java.awt.Container;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicHTML; import javax.swing.plaf.basic.BasicHTML;
import javax.swing.plaf.basic.BasicOptionPaneUI; import javax.swing.plaf.basic.BasicOptionPaneUI;
import com.formdev.flatlaf.util.UIScale; import com.formdev.flatlaf.util.UIScale;
@@ -30,6 +35,9 @@ import com.formdev.flatlaf.util.UIScale;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JOptionPane}. * Provides the Flat LaF UI delegate for {@link javax.swing.JOptionPane}.
* *
* @uiDefault OptionPane.font Font unused
* @uiDefault OptionPane.background Color
* @uiDefault OptionPane.foreground Color unused
* @uiDefault OptionPane.border Border * @uiDefault OptionPane.border Border
* @uiDefault OptionPane.messageAreaBorder Border * @uiDefault OptionPane.messageAreaBorder Border
* @uiDefault OptionPane.buttonAreaBorder Border * @uiDefault OptionPane.buttonAreaBorder Border
@@ -77,6 +85,13 @@ public class FlatOptionPaneUI
focusWidth = UIManager.getInt( "Component.focusWidth" ); focusWidth = UIManager.getInt( "Component.focusWidth" );
} }
@Override
protected void installComponents() {
super.installComponents();
updateChildPanels( optionPane );
}
@Override @Override
public Dimension getMinimumOptionPaneSize() { public Dimension getMinimumOptionPaneSize() {
return UIScale.scale( super.getMinimumOptionPaneSize() ); return UIScale.scale( super.getMinimumOptionPaneSize() );
@@ -130,6 +145,26 @@ public class FlatOptionPaneUI
super.addMessageComponents( container, cons, msg, maxll, internallyCreated ); super.addMessageComponents( container, cons, msg, maxll, internallyCreated );
} }
private void updateChildPanels( Container c ) {
for( Component child : c.getComponents() ) {
if( child instanceof JPanel ) {
JPanel panel = (JPanel)child;
// make sub-panel non-opaque for OptionPane.background
panel.setOpaque( false );
// use non-UIResource borders to avoid that they are replaced when switching LaF
Border border = panel.getBorder();
if( border instanceof UIResource )
panel.setBorder( new NonUIResourceBorder( border ) );
}
if( child instanceof Container ) {
updateChildPanels( (Container) child );
}
}
}
private Component findByName( Container c, String name ) { private Component findByName( Container c, String name ) {
for( Component child : c.getComponents() ) { for( Component child : c.getComponents() ) {
if( name.equals( child.getName() ) ) if( name.equals( child.getName() ) )
@@ -143,4 +178,31 @@ public class FlatOptionPaneUI
} }
return null; return null;
} }
//---- class NonUIResourceBorder ------------------------------------------
private static class NonUIResourceBorder
implements Border
{
private final Border delegate;
NonUIResourceBorder( Border delegate ) {
this.delegate = delegate;
}
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
delegate.paintBorder( c, g, x, y, width, height );
}
@Override
public Insets getBorderInsets( Component c ) {
return delegate.getBorderInsets( c );
}
@Override
public boolean isBorderOpaque() {
return delegate.isBorderOpaque();
}
}
} }

View File

@@ -147,6 +147,9 @@ MenuItemCheckBox.icon.disabledCheckmarkColor=ABABAB
#---- OptionPane ---- #---- OptionPane ----
OptionPane.background=ffdddd
OptionPane.foreground=ff0000
OptionPane.icon.errorColor=ff0000 OptionPane.icon.errorColor=ff0000
OptionPane.icon.informationColor=00ff00 OptionPane.icon.informationColor=00ff00
OptionPane.icon.questionColor=0000ff OptionPane.icon.questionColor=0000ff