我感觉很傻。但是,为什么这段简单的代码不改变椭圆的颜色是什么原因呢?
基本上,我想将鼠标侦听器添加到椭圆形-图形对象。当鼠标光标位于椭圆形时,椭圆形会更改其颜色。但是这段代码根本不会改变...该代码仅用于测试。
public class Help extends JFrame{
public static void main(String [] agrs){
Help h = new Help();
h.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
h.add(new Help_Option());
h.setSize(2000, 1000);
h.setVisible(true);
}
}
class Help_Option extends JComponent implements MouseListener{
Ellipse2D ellipse = new Ellipse2D.Double(0, 0, 1000, 500);
Color c = Color.BLACK;
public Help_Option(){
this.addMouseListener(this);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLUE);
g2d.draw(ellipse);
g2d.setColor(c);
g2d.fill(ellipse);
}
public void setColor(Color c){
this.c = c;
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY()) ) {
setColor(Color.GREEN);
repaint();
}
}
@Override
public void mouseExited(MouseEvent e) {
}
}
最佳答案
您正在添加MouseListener
并等待mouseEntered
事件。当鼠标进入Component
而不是其区域时,将触发它们。尝试输入显示椭圆的组件边界并观察。
您需要的是MouseMotionListener
,以便您可以逐个像素观察鼠标。使用mouseMoved
或mouseDragged
事件。
您可能仍需要侦听mouseEntered
或mouseExited
事件,因为MouseMotionEvent
仅在组件边界之内触发,因此您可能会错过在椭圆形内部退出组件的鼠标。
调试此错误的一种好方法是在事件处理程序中添加打印内容。然后,您将看到只调用了一次或几次处理程序,而不是在组件内移动鼠标时调用了该处理程序。
class Help_Option extends JComponent implements MouseListener, MouseMotionListener {
Ellipse2D ellipse = ...;
public Help_Option() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY()) ) {
//mouse is inside the ellipse
} else {
//mouse is outside the ellipse
}
}
public void mouseExited(MouseEvent e) {
//mouse is outside the ellipse
}
//more method stubs
}