我觉得自己很蠢。但是为什么这段简单的代码没有改变椭圆的颜色呢?
基本上我想向椭圆形添加一个鼠标监听器 - 一个图形对象。当鼠标光标处于椭圆形时,椭圆形会改变其颜色。但是这段代码根本没有改变......这段代码仅用于测试。
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
}
关于java - 图形对象上的 MouseListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23083057/