如何在单击时更改 Jbutton 的背景颜色
How to change the background color of a Jbutton on click
我试图在您单击 JButton 时更改它的颜色,但出现的是蓝色,而不是我写的那个。
目标:目标是当你点击按钮时颜色改变
我搜索了几次,但每次都出现蓝色字体。
我试过重写 paintComponent,几个替代方案,例如 this.getModel,但没有任何效果。
我的按钮class:
package com.tralamy.lancherX.display;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TButton extends JButton {
private Color hoverColor = Display.LIGHT_GRAY;
private Color pressColor = Display.LIGHT_DARK;
private Color firstColor;
private Color basic;
private MouseAdapter hoverAdapter = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
basic = firstColor;
TButton.this.setBackground(hoverColor);
}
@Override
public void mouseExited(MouseEvent e) {
TButton.this.setBackground(basic);
}
};
private MouseAdapter pressAdapter = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
TButton.this.setBackground(pressColor);
super.mousePressed(e);
}
@Override
public void mouseReleased(MouseEvent e) {
TButton.this.setBackground(basic);
super.mouseReleased(e);
}
};
public TButton (String text){
super(text);
init();
}
public TButton (Icon icon){
super(icon);
init();
}
public TButton (){
super();
init();
}
private void init()
{
firstColor = this.getBackground();
setBorder(null);
setBorderPainted(false);
setContentAreaFilled(false);
setOpaque(false);
setFocusPainted(false);
setPressedIcon(new ImageIcon());
}
@Override
public void setBackground(Color bg) {
super.setBackground(bg);
firstColor = bg;
}
public void setHover()
{
this.addMouseListener(hoverAdapter);
}
public void removeHover()
{
this.removeMouseListener(hoverAdapter);
}
public void setPress()
{
this.addMouseListener(pressAdapter);
}
public void removePress()
{
this.removeMouseListener(pressAdapter);
}
public void setHoverColor(Color color)
{
hoverColor = color;
}
public Color getHoverColor()
{
return hoverColor;
}
public Color getPressColor() {
return pressColor;
}
public void setPressColor(Color pressColor) {
this.pressColor = pressColor;
}
}
主菜单面板:
private JPanel menuPanel() {
mp = new JPanel();
setPercentWidth(mp, 25);
mp.setBackground(LIGHT_GRAY);
mp.setLayout(new BorderLayout());
JPanel userSection = new JPanel();
userSection.setLayout(new GridBagLayout());
setPercentHeight(userSection, 5);
userSection.setPreferredSize(new Dimension(userSection.getWidth(), 0));
userSection.setBackground(LIGHT_DARK);
userIconButton.setHorizontalAlignment(SwingConstants.CENTER);
userName.setHorizontalAlignment(SwingConstants.CENTER);
userIconButton.setBorder(new EmptyBorder(0,0,0,10));
userSection.add(userIconButton);
userSection.add(userName);
menuButtons.add(new TButton("Library"));
menuButtons.add(new TButton("Store"));
menuButtons.add(new TButton("Friends"));
menuButtons.add(new TButton("News"));
JPanel menuSection = new JPanel();
menuSection.setLayout(new BoxLayout(menuSection, BoxLayout.Y_AXIS));
menuSection.setOpaque(false);
for (TButton button : menuButtons) {
button.setAlignmentX(TButton.CENTER_ALIGNMENT);
button.setFont(App.setSemiBoldNunito(48));
button.setForeground(SUPER_SUPER_LIGHT_GRAY);
button.setBackground(SUPER_LIGHT_GRAY);
button.setBorder(null);
button.setBorderPainted(true);
button.setContentAreaFilled(true);
button.setOpaque(true);
button.setHoverColor(DARK_GRAY);
button.setHover();
button.setPressColor(LIGHT_DARK);
button.setPress();
TButton marginLabel = new TButton();
marginLabel.setSize(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN);
marginLabel.setMaximumSize(new Dimension(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN));
marginLabel.setMinimumSize(new Dimension(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN));
setPercentWidth(button, 20);
menuSection.add(marginLabel);
menuSection.add(button);
}
mp.add(menuSection);
mp.add(userSection, BorderLayout.SOUTH);
return mp;
}
然后是一些图片:
My bug
提前谢谢你
如果你想在用户点击按钮的时候改变按钮的背景颜色,那么你可以使用setContentAreaFilled(false)
。那么需要将不透明属性重新设置为true
,因为根据the docs of setContentAreaFilled
:“这个函数可能会导致组件的不透明属性改变。",例如:
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MainPersist {
private static void createAndShowGUI() {
final JButton button = new JButton("Click to change color");
button.addActionListener(e -> {
button.setContentAreaFilled(false);
button.setOpaque(true); //Reset the opacity.
button.setBackground(Color.CYAN.darker()); //Set your desired color as the background.
});
final JFrame frame = new JFrame("Button bg on click");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainPersist::createAndShowGUI);
}
}
否则,如果您希望按钮仅在单击时更改其颜色,然后 return 在释放时恢复正常,请查看 大致相同的内容。它还没有被接受的答案(截至发布这个答案本身是最近的),但至少有 one/my 答案(建议修改按钮的 ButtonUI
)并且有我想应该会有更多答案。
我试图在您单击 JButton 时更改它的颜色,但出现的是蓝色,而不是我写的那个。
目标:目标是当你点击按钮时颜色改变
我搜索了几次,但每次都出现蓝色字体。
我试过重写 paintComponent,几个替代方案,例如 this.getModel,但没有任何效果。
我的按钮class:
package com.tralamy.lancherX.display;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TButton extends JButton {
private Color hoverColor = Display.LIGHT_GRAY;
private Color pressColor = Display.LIGHT_DARK;
private Color firstColor;
private Color basic;
private MouseAdapter hoverAdapter = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
basic = firstColor;
TButton.this.setBackground(hoverColor);
}
@Override
public void mouseExited(MouseEvent e) {
TButton.this.setBackground(basic);
}
};
private MouseAdapter pressAdapter = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
TButton.this.setBackground(pressColor);
super.mousePressed(e);
}
@Override
public void mouseReleased(MouseEvent e) {
TButton.this.setBackground(basic);
super.mouseReleased(e);
}
};
public TButton (String text){
super(text);
init();
}
public TButton (Icon icon){
super(icon);
init();
}
public TButton (){
super();
init();
}
private void init()
{
firstColor = this.getBackground();
setBorder(null);
setBorderPainted(false);
setContentAreaFilled(false);
setOpaque(false);
setFocusPainted(false);
setPressedIcon(new ImageIcon());
}
@Override
public void setBackground(Color bg) {
super.setBackground(bg);
firstColor = bg;
}
public void setHover()
{
this.addMouseListener(hoverAdapter);
}
public void removeHover()
{
this.removeMouseListener(hoverAdapter);
}
public void setPress()
{
this.addMouseListener(pressAdapter);
}
public void removePress()
{
this.removeMouseListener(pressAdapter);
}
public void setHoverColor(Color color)
{
hoverColor = color;
}
public Color getHoverColor()
{
return hoverColor;
}
public Color getPressColor() {
return pressColor;
}
public void setPressColor(Color pressColor) {
this.pressColor = pressColor;
}
}
主菜单面板:
private JPanel menuPanel() {
mp = new JPanel();
setPercentWidth(mp, 25);
mp.setBackground(LIGHT_GRAY);
mp.setLayout(new BorderLayout());
JPanel userSection = new JPanel();
userSection.setLayout(new GridBagLayout());
setPercentHeight(userSection, 5);
userSection.setPreferredSize(new Dimension(userSection.getWidth(), 0));
userSection.setBackground(LIGHT_DARK);
userIconButton.setHorizontalAlignment(SwingConstants.CENTER);
userName.setHorizontalAlignment(SwingConstants.CENTER);
userIconButton.setBorder(new EmptyBorder(0,0,0,10));
userSection.add(userIconButton);
userSection.add(userName);
menuButtons.add(new TButton("Library"));
menuButtons.add(new TButton("Store"));
menuButtons.add(new TButton("Friends"));
menuButtons.add(new TButton("News"));
JPanel menuSection = new JPanel();
menuSection.setLayout(new BoxLayout(menuSection, BoxLayout.Y_AXIS));
menuSection.setOpaque(false);
for (TButton button : menuButtons) {
button.setAlignmentX(TButton.CENTER_ALIGNMENT);
button.setFont(App.setSemiBoldNunito(48));
button.setForeground(SUPER_SUPER_LIGHT_GRAY);
button.setBackground(SUPER_LIGHT_GRAY);
button.setBorder(null);
button.setBorderPainted(true);
button.setContentAreaFilled(true);
button.setOpaque(true);
button.setHoverColor(DARK_GRAY);
button.setHover();
button.setPressColor(LIGHT_DARK);
button.setPress();
TButton marginLabel = new TButton();
marginLabel.setSize(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN);
marginLabel.setMaximumSize(new Dimension(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN));
marginLabel.setMinimumSize(new Dimension(MAIN_MENU_MARGIN, MAIN_MENU_MARGIN));
setPercentWidth(button, 20);
menuSection.add(marginLabel);
menuSection.add(button);
}
mp.add(menuSection);
mp.add(userSection, BorderLayout.SOUTH);
return mp;
}
然后是一些图片: My bug
提前谢谢你
如果你想在用户点击按钮的时候改变按钮的背景颜色,那么你可以使用setContentAreaFilled(false)
。那么需要将不透明属性重新设置为true
,因为根据the docs of setContentAreaFilled
:“这个函数可能会导致组件的不透明属性改变。",例如:
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MainPersist {
private static void createAndShowGUI() {
final JButton button = new JButton("Click to change color");
button.addActionListener(e -> {
button.setContentAreaFilled(false);
button.setOpaque(true); //Reset the opacity.
button.setBackground(Color.CYAN.darker()); //Set your desired color as the background.
});
final JFrame frame = new JFrame("Button bg on click");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(MainPersist::createAndShowGUI);
}
}
否则,如果您希望按钮仅在单击时更改其颜色,然后 return 在释放时恢复正常,请查看 ButtonUI
)并且有我想应该会有更多答案。