如何在单击时更改Jbutton的背景颜色

问题描述

当我单击它时,我正在尝试更改JButton的颜色,但是会出现蓝色,而不是我写的颜色。

目标:目标是当您单击按钮时颜色会改变

我进行了几次搜索,但是每次出现蓝色字体。

我尝试覆盖paintComponent,并使用this.getModel等几种替代方法,但没有任何效果。

我的按钮类:

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,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)。然后需要将opaque属性重置为true,因为根据the docs of setContentAreaFilled:“ 此函数可能导致组件的opaque属性发生更改。”,例如:>

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);
    }
}

否则,如果您希望按钮仅在单击时改变其颜色,然后在释放时恢复正常,则请看一下this question,它就是这样。它尚无接受的答案(此答案本身发布时是最近的),但是至少有一个/我的答案(建议修改按钮的ButtonUI),应该有一个答案我猜还会有更多答案。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...