Java Swing GUI 在鼠标悬停时改变颜色

标签 java swing jbutton

我对 Java Swing 库比较陌生,我正在尝试使用 3 x 3 网格的 JButton 编写一个 tic tac toe 程序。当用户选择一个按钮时,我将更改包含所选按钮的行和列的背景颜色,以添加突出显示的感觉(通过将每个 JButton 的 button.setBackground() 更改为不同的颜色)。

但是,我目前遇到一个问题:当鼠标拖动到突出显示的按钮之一上时,新的背景颜色会被删除(并更改回旧的背景颜色)。

当鼠标进入按钮时,似乎有一个鼠标事件正在重新绘制按钮,但是我尝试关闭此事件,但未能成功。

我将非常感谢任何帮助!如果我需要澄清任何事情,请告诉我。谢谢

最佳答案

如果您想将按钮更改回默认值,请将背景设置为NULL:

button.setBackground(inBounds ? new Color(0xFFFF00) : null);

这是我举的一个例子。您可以将其作为引用。

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GridRollOver extends JFrame implements MouseListener {

    private static final long serialVersionUID = -7134685459910610342L;

    public JButton[] buttons = new JButton[9];

    public GridRollOver() {
        this.setLayout(new GridLayout(3, 3));
        for (int i = 0; i < 9; i++) {
            JButton b = new JButton();
            b.setRolloverEnabled(true);
            b.addMouseListener(this);
            this.add(b);
            buttons[i] = b;
        }

        this.setVisible(true);
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        new GridRollOver();
    }

    public void highlightButtons(Point cursor) {
        for (int i = 0; i < buttons.length; i++) {
            JButton button = buttons[i];
            Point buttonLocation = button.getLocationOnScreen();
            double west = buttonLocation.getX();
            double east = buttonLocation.getX() + button.getWidth();
            double north = buttonLocation.getY();
            double south = buttonLocation.getY() + button.getHeight();
            boolean inRow = cursor.getX() > west && cursor.getX() < east;
            boolean inCol = cursor.getY() > north && cursor.getY() < south;
            boolean inBounds = inRow || inCol;
            button.setBackground(inBounds ? new Color(0xFFFF00) : null);
        }
    }

    @Override
    public void mouseEntered(MouseEvent event) {
        highlightButtons(event.getLocationOnScreen());
    }

    @Override
    public void mouseExited(MouseEvent e) { }

    @Override
    public void mouseClicked(MouseEvent e) { }

    @Override
    public void mousePressed(MouseEvent e) { }

    @Override
    public void mouseReleased(MouseEvent e) { }
}

关于Java Swing GUI 在鼠标悬停时改变颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16755831/

相关文章:

java - 使用助记符调用JButton按下动画

java - 我正在尝试使用 JFrame 创建计算器,但遇到一些困难

java - Java中通过注解值获取枚举值

java - 从列表中选择一个元素

java - 使用按钮将 JTextArea 保存到 .txt 文件

java - 使 JButton 出现在 JLabel 前面

java - JButton 上的多个dispatchEvent 调用

java - 在 Joda-Time 中,将 DateTime 分隔为末尾带有时区 `Z` 的日期和时间

java - 无法处理 DOMSource : check that saxon9-dom. jar 在类路径上

java - tomcat管理器本地获取错误