我对 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/