java - 框架上的鼠标监听器

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

 }}

最佳答案

在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/

相关文章:

java - 显示鼠标附近的鼠标坐标作为鼠标移动的提示

javascript - 当鼠标接近时更改背景

java - Action 监听器actionPerformed通过代码double执行

java - 在 GridBagLayout 中调用 SetContraints 时出现 NullPointerException

java - 为什么我在 Java 中收到 NoClassDefFoundError 错误?

java - 当任何 PIT 突变失败时,maven 构建可能会失败,而不是突变覆盖?

select - emacs 鼠标 Shift + 从光标点选择

java - 如何在 KeyListener 中调用 Graphics 方法?

java - 如何将 JtextArea 中的所有文本输出到保存文件?

java - 如何在 Java 中实现 lower_bound 二进制搜索算法?