嗨 我正在尝试向我的框架添加一个鼠标监听器以获取鼠标单击的位置并检查它是否在圆圈内,问题是它没有触发
public class CircleDraw extends Frame implements MouseListener {
static int circles = 0;
private double color;
double mousex = 0;
double mousey = 0;
int score;
public void mouseClicked(MouseEvent evt)
{
mousex = evt.getX();
mousey = evt.getY();
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {}
public void mouseReleased (MouseEvent me) {}
public void mouseExited (MouseEvent me) {}
public void paint(Graphics g) {
try {
this.addMouseListener(this);
while (circles < 20) {
color = 10*Math.random();
Shape circle = new Ellipse2D.Double(900*Math.random(),900*Math.random(), 50.0f, 50.0f);
Graphics2D ga = (Graphics2D)g;
ga.draw(circle);
if(color >2)
ga.setPaint(Color.green);
else
ga.setPaint(Color.BLACK);
ga.fill(circle);
if(circle.contains(mousex, mousey) && color > 2)
score ++;
else
if(circle.contains(mousex, mousey) && color < 2)
score--;
Thread.sleep(1000);
System.out.println(circles);
System.out.println(mousex);
System.out.println(mousey);
circles ++;
ga.setPaint(Color.white);
ga.fill(circle);
}
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Frame frame = new CircleDraw();
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
frame.setSize(1000, 1000);
frame.setVisible(true);
}}
最佳答案
在paint()方法中添加鼠标监听器是致命的,因为该方法被非常频繁地调用(每次重绘),并且添加了如此多的监听器(每次重绘)。
您应该将监听器添加到内容面板而不是 JFrame 本身。这样就可以了。您可以在类的构造函数中执行此操作:
public CircleDraw() {
this.getContentPane().addMouseListener(this);
}
我认为这并不能完全解决你的问题,因为当你的绘画方法处于 Activity 状态时你不会得到鼠标点击。您的代码设计(尤其是 while 循环)没有给其他事件任何时间来触发。因此 mouseclick 事件将在 20 次循环后处理。您可以通过添加
来检查这一点public void mouseClicked(MouseEvent evt) {
mousex = evt.getX();
mousey = evt.getY();
System.out.println("X: "+mousex+"/ Y: "+mousey);
}
到你的代码。您必须在不同的线程中运行 GUI(例如,使用 SwingUtilities 和 Runnable())。我推荐你看一本关于JAVA开发的好书。或者您可以从在线教程开始,例如 this one .
恕我直言,您不应该尝试使用 awt,而是使用 SWING 或 SWT 进行 GUI 设计,因为这更舒适。
关于java - 框架上的鼠标监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6225959/