Tru*_*Bún 1 java graphics swing java-2d mouselistener
我感觉非常愚蠢.但是为什么这段简单的代码不会改变椭圆的颜色呢?
基本上我想在椭圆上添加一个鼠标监听器 - 一个图形对象.当鼠标光标为椭圆形时,椭圆会改变其颜色.但是这段代码根本没有改变......这段代码仅供测试.
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
你正在添加一个MouseListener
等待mouseEntered
事件.当鼠标进入Component
而不是它的区域时会触发这些.尝试进入显示椭圆的组件边界并观察.
你需要的是一个MouseMotionListener
,这样你就可以逐个像素地观察鼠标; 使用mouseMoved
或mouseDragged
事件.
您可能仍然需要监听mouseEntered
或mouseExited
事件,因为MouseMotionEvent
s仅在组件边界内被触发,因此您可能会在仍在椭圆内部时遗漏退出组件的鼠标.
调试它的一种简单方法是在事件处理程序中添加打印.然后,您将看到处理程序被调用,但只有一次或几次,而不是在组件中移动鼠标时.
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
}
Run Code Online (Sandbox Code Playgroud)
..如果我使用椭圆的边界,它将是一个矩形,所以每当我的鼠标进入矩形但不是椭圆形时,颜色会改变
看到:
Shape.contains(x,y)
:测试指定的坐标是否在边界内Shape
,如内部定义所述.Shape.contains(Point2D)
:测试指定Point2D
是否在边界内Shape
,如内部定义所述.有关2个形状之间碰撞的演示,请参阅此答案.
归档时间: |
|
查看次数: |
3021 次 |
最近记录: |