Reputation: 2651
I want to use the system look and feel for a Swing application. So I used the getSystemLookAndFeelClassName()
method which works pretty fine.
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
But, now I want to change all the JButtons
of the app (in all my JFrames
, JDialogs
, JOptionPanes
, JFileChoosers
, etc.) and only the JButtons
. So I would like to know how can I extend the system look and feel to keep it for all components except the JButtons
(and the JPanels
, which I want with a gray background).
Thank you.
Upvotes: 1
Views: 1413
Reputation: 2651
Finally I extended the system look and feel like this:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIManager.put("ButtonUI", "com.my.package.MyButtonUI");
UIManager.put("Panel.background", Color.green);
With MyButtonUI
:
public class MyButtonUI extends BasicButtonUI {
public static final int BUTTON_HEIGHT = 24;
private static final MyButtonUI INSTANCE = new MyButtonUI ();
public static ComponentUI createUI(JComponent b) {
return INSTANCE;
}
@Override
public void paint(Graphics g, JComponent c) {
AbstractButton button = (AbstractButton) c;
Graphics2D g2d = (Graphics2D) g;
final int buttonWidth = button.getWidth();
if (button.getModel().isRollover()) {
// Rollover
GradientPaint gp = new GradientPaint(0, 0, Color.green, 0, BUTTON_HEIGHT * 0.6f, Color.red, true);
g2d.setPaint(gp);
} else if (button.isEnabled()) {
// Enabled
GradientPaint gp = new GradientPaint(0, 0, Color.red, 0, BUTTON_HEIGHT * 0.6f, Color.gray, true);
g2d.setPaint(gp);
} else {
// Disabled
GradientPaint gp = new GradientPaint(0, 0, Color.black, 0, BUTTON_HEIGHT * 0.6f, Color.blue, true);
g2d.setPaint(gp);
}
g2d.fillRect(0, 0, buttonWidth, BUTTON_HEIGHT);
super.paint(g, button);
}
@Override
public void update(Graphics g, JComponent c) {
AbstractButton button = (AbstractButton) c;
if (isInToolBar(button)) {
// Toolbar button
button.setOpaque(false);
super.paint(g, button);
} else if (button.isOpaque()) {
// Other opaque button
button.setRolloverEnabled(true);
button.setForeground(Color.white);
paint(g, button);
} else {
// Other non-opaque button
super.paint(g, button);
}
}
private boolean isInToolBar(AbstractButton button) {
return SwingUtilities.getAncestorOfClass(JToolBar.class, button) != null;
}
}
Note: I higly recommend this link: http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/ (from Robin)
Thank you.
Upvotes: 1
Reputation: 1220
You could also make your own button class, e.g. CustomButton, which extends JButton, make all your changes and use this instead of the standard JButton. This way you can use both custom and standard buttons - if you change your mind and want to add a standard JButton somewhere ;)
Upvotes: 0