鼠标监听器在框架上

时间:2011-06-03 10:34:22

标签: java mouse awt frame

您好 我正在尝试将鼠标监听器添加到我的框架中以获取鼠标点击的位置并检查它是否在圆圈内,问题是它没有触发

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);

 }}

3 个答案:

答案 0 :(得分:2)

在paint()方法中添加mouselistener是致命的,因为这个方法经常被调用(每次重绘),并且添加了很多侦听器(每次重绘)。

您应该将侦听器添加到内容面板而不是JFrame本身。这样做。您可以在类的构造函数中执行此操作:

public CircleDraw() {
    this.getContentPane().addMouseListener(this);
}

我认为这不会完全解决你的问题,因为你的paint-method处于活动状态时你不会得到你的鼠标点击。您的代码设计(尤其是您的while循环)不会给其他事件发送任何时间。所以mouseclick-event将在你的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设计,因为这样更容易理解。

答案 1 :(得分:0)

在构造函数中添加侦听器,重复调用paint

答案 2 :(得分:0)

以下是我在该来源中看到的一些问题:

  1. paint()
  2. 中添加侦听器
  3. wait()方法中调用paint()
  4. System.exit()方法中调用paint()(严格来说不是问题,但很不寻常)。
  5. 格式错误且难以理解
  6. 调用弃用的方法。
  7. 错误的千年中的AWT代码。