如何将所有 JButton 的默认鼠标按下背景颜色覆盖为当前背景颜色的深色阴影?
How can I override the default mousepressed background color of all JButtons into a darker shade of its current background color?
假设我有 10 个 JButtons
,每个都明确设置了自己的背景颜色。
现在,它们都获得了默认的鼠标按下背景颜色,但我如何才能将其设置为比各自背景颜色更暗的阴影,而不是一个一个地设置?
我知道我可以覆盖 UIManager
中的颜色 :
UIManager.put("Button.select", Color.RED);
我在这里找到的 How to change a JButton color on mouse pressed?
但这只会将其更改为单一颜色。我所有的按钮在按下时都会变成红色背景。
有没有办法让它变成这样:
UIManager.put("Button.select", JButton.getBackground().darker());
我正在努力学习java挥杆,请原谅我的无知。
实现此目的的一种方法是创建您自己的 ButtonUI
。为了避免重新发明轮子的麻烦,您可以扩展 ButtonUI
.
的子类
例如BasicButtonUI
像这样:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Objects;
import java.util.Random;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicButtonUI;
public class MainWithBasicButtonUI {
public static class SelectButtonUI extends BasicButtonUI {
protected Color selectColor;
public void setSelectColor(final Color selectColor) {
this.selectColor = Objects.requireNonNull(selectColor);
}
public Color getSelectColor() {
return selectColor;
}
@Override
protected void paintButtonPressed(final Graphics g,
final AbstractButton b){
if (b.isContentAreaFilled()) {
Dimension size = b.getSize();
g.setColor(getSelectColor());
g.fillRect(0, 0, size.width, size.height);
}
}
}
private static void createAndShowGUI() {
final int rows = 3, cols = 3;
final Color[] colors = new Color[]{Color.RED.brighter(), Color.GREEN.brighter(), Color.CYAN};
final JPanel buttons = new JPanel(new GridLayout(rows, cols, 2, 2));
final Random rand = new Random();
for (int i = 0; i < rows * cols; ++i) {
final JButton b = new JButton("Button");
b.setBackground(colors[rand.nextInt(colors.length)]);
final SelectButtonUI ui = new SelectButtonUI();
ui.setSelectColor(b.getBackground().darker());
b.setUI(ui);
buttons.add(b);
}
final JFrame frame = new JFrame("App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(buttons);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainWithBasicButtonUI::createAndShowGUI);
}
}
或者,更好的是,MetalButtonUI
像这样:
import java.awt.Color;
import java.awt.GridLayout;
import java.util.Objects;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.metal.MetalButtonUI;
public class MainWithMetalButtonUI {
public static class SelectButtonUI extends MetalButtonUI {
public SelectButtonUI() {
selectColor = super.getSelectColor();
}
public void setSelectColor(final Color selectColor) {
this.selectColor = Objects.requireNonNull(selectColor);
}
@Override
protected Color getSelectColor() {
return selectColor;
}
}
private static void createAndShowGUI() {
final int rows = 3, cols = 3;
final Color[] colors = new Color[]{Color.RED.brighter(), Color.GREEN.brighter(), Color.CYAN};
final JPanel buttons = new JPanel(new GridLayout(rows, cols, 2, 2));
final Random rand = new Random();
for (int i = 0; i < rows * cols; ++i) {
final JButton b = new JButton("Button");
b.setBackground(colors[rand.nextInt(colors.length)]);
final SelectButtonUI ui = new SelectButtonUI();
ui.setSelectColor(b.getBackground().darker());
b.setUI(ui);
buttons.add(b);
}
final JFrame frame = new JFrame("App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(buttons);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainWithMetalButtonUI::createAndShowGUI);
}
}
唯一的问题是,您所有的按钮总是看起来像金属 L&F。
假设我有 10 个 JButtons
,每个都明确设置了自己的背景颜色。
现在,它们都获得了默认的鼠标按下背景颜色,但我如何才能将其设置为比各自背景颜色更暗的阴影,而不是一个一个地设置?
我知道我可以覆盖 UIManager
中的颜色 :
UIManager.put("Button.select", Color.RED);
我在这里找到的 How to change a JButton color on mouse pressed?
但这只会将其更改为单一颜色。我所有的按钮在按下时都会变成红色背景。
有没有办法让它变成这样:
UIManager.put("Button.select", JButton.getBackground().darker());
我正在努力学习java挥杆,请原谅我的无知。
实现此目的的一种方法是创建您自己的 ButtonUI
。为了避免重新发明轮子的麻烦,您可以扩展 ButtonUI
.
例如BasicButtonUI
像这样:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Objects;
import java.util.Random;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicButtonUI;
public class MainWithBasicButtonUI {
public static class SelectButtonUI extends BasicButtonUI {
protected Color selectColor;
public void setSelectColor(final Color selectColor) {
this.selectColor = Objects.requireNonNull(selectColor);
}
public Color getSelectColor() {
return selectColor;
}
@Override
protected void paintButtonPressed(final Graphics g,
final AbstractButton b){
if (b.isContentAreaFilled()) {
Dimension size = b.getSize();
g.setColor(getSelectColor());
g.fillRect(0, 0, size.width, size.height);
}
}
}
private static void createAndShowGUI() {
final int rows = 3, cols = 3;
final Color[] colors = new Color[]{Color.RED.brighter(), Color.GREEN.brighter(), Color.CYAN};
final JPanel buttons = new JPanel(new GridLayout(rows, cols, 2, 2));
final Random rand = new Random();
for (int i = 0; i < rows * cols; ++i) {
final JButton b = new JButton("Button");
b.setBackground(colors[rand.nextInt(colors.length)]);
final SelectButtonUI ui = new SelectButtonUI();
ui.setSelectColor(b.getBackground().darker());
b.setUI(ui);
buttons.add(b);
}
final JFrame frame = new JFrame("App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(buttons);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainWithBasicButtonUI::createAndShowGUI);
}
}
或者,更好的是,MetalButtonUI
像这样:
import java.awt.Color;
import java.awt.GridLayout;
import java.util.Objects;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.metal.MetalButtonUI;
public class MainWithMetalButtonUI {
public static class SelectButtonUI extends MetalButtonUI {
public SelectButtonUI() {
selectColor = super.getSelectColor();
}
public void setSelectColor(final Color selectColor) {
this.selectColor = Objects.requireNonNull(selectColor);
}
@Override
protected Color getSelectColor() {
return selectColor;
}
}
private static void createAndShowGUI() {
final int rows = 3, cols = 3;
final Color[] colors = new Color[]{Color.RED.brighter(), Color.GREEN.brighter(), Color.CYAN};
final JPanel buttons = new JPanel(new GridLayout(rows, cols, 2, 2));
final Random rand = new Random();
for (int i = 0; i < rows * cols; ++i) {
final JButton b = new JButton("Button");
b.setBackground(colors[rand.nextInt(colors.length)]);
final SelectButtonUI ui = new SelectButtonUI();
ui.setSelectColor(b.getBackground().darker());
b.setUI(ui);
buttons.add(b);
}
final JFrame frame = new JFrame("App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(buttons);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainWithMetalButtonUI::createAndShowGUI);
}
}
唯一的问题是,您所有的按钮总是看起来像金属 L&F。