我正在创建自己的Button类,扩展了JLabel。 我的目标是在鼠标悬停在其上时立即改变其背景。 所以这就是我得到的:
public String st;
public boolean hover = false, down = false;
public Button() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println(hover); // false
hover = true;
System.out.println(hover); // true
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println(hover); // true
hover = false;
System.out.println(hover); // false
}
@Override
public void mousePressed(MouseEvent e) {
down = true;
}
@Override
public void mouseReleased(MouseEvent e) {
down = false;
}
});
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(mainColor());
g.fillRect(0, 0, getWidth(), getHeight());
}
public Color mainColor() {
return down ? c1 : (hover ? c2 : c3);
// hover is always false
}
由于某种原因,布尔值只会在鼠标侦听器内部发生变化。 为了让事情更加混乱,几乎相同的代码在另一个类中完美地运行。
答案 0 :(得分:1)
您永远不会在repaint()
代码中调用MouseListener
,因此不会调用paintComponent()
方法。
每当您更改自定义组件的属性时,都需要调用repaint()
以确保组件以新状态绘制。
我正在创建自己的Button类,扩展了JLabel。
为什么要将JLabel扩展为绘制背景?您应该扩展JPanel或JComponent。
如果您需要更多帮助(以及将来提出问题时),请发布适当的MCVE来证明问题。