首页 > 解决方案 > Java 中的 Click Listener 出现问题

问题描述

我正在用java制作一个类似国际象棋的游戏,但点击事件有问题。该mouseClicked功能没有响应我在窗口上的点击,并且没有明显的原因。

我已经尝试了一些事情,例如更改类名和使用不同的函数,但没有任何效果。

package main.game.com;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;     

public class ClickEvent extends MouseAdapter {

    public void mouseClicked(MouseEvent e) {
            System.out.println("hello");
    }

}

package main.game.com;

import java.awt.Canvas;

public class Main extends Canvas {

    private static final long serialVersionUID = 1673528055664762143L;

    private static final int WIDTH = 416, HEIGHT = 439;

    public Main() {
        Window window = new Window(WIDTH, HEIGHT, "DARRAGH", this);
        this.addMouseListener(new ClickEvent());
    }   

package main.game.com;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class Window extends Canvas {

    private static final long serialVersionUID = 6733885629776844621L;

    public Window(int width, int height, String title, Main main) {

        JFrame frame = new JFrame(title);   

        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.add(main);
        frame.setVisible(true);
        main.start();

    }
}

第一组代码是我的mouseAdapter库,第二组是我的主类的第一部分,其中包含clickListener.

标签: javaswingawtmouselistener

解决方案


您正在创建一个 Handler 对象,很好,您正在将它添加到一个 Canvas 对象(this为什么是 Canvas?),并且您正在创建一个实际上是 Window 类型的“顶级”窗口对象,但是您从未将 Canvas 添加到 Window,也不会显示 Window,因此没有理由期望此代码实际上可以工作。

现在,我猜您没有向我们展示更多代码,这可能具有相关性,如果是这样,请考虑创建和发布足够的MCVE,以便让我们更好地理解您的问题。

好的,我用你的代码创建了一个 MCVE:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Main extends Canvas {

    private static final long serialVersionUID = 1673528055664762143L;

    private static final int WIDTH = 416, HEIGHT = 439;

    public Main() {
        Procode238Window window = new Procode238Window(WIDTH, HEIGHT, "DARRAGH", this);
        this.addMouseListener(new ClickEvent());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new Main();
        });
    }

}

class ClickEvent extends MouseAdapter {

    public void mouseClicked(MouseEvent e) {
        System.out.println("hello");
    }

}

// renamed to avoid clashing with the java.awt.Window class    
class Procode238Window extends Canvas {

    private static final long serialVersionUID = 6733885629776844621L;

    public Procode238Window(int width, int height, String title, Main main) {

        JFrame frame = new JFrame(title);

        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.add(main);
        frame.setVisible(true);
        // !! main.start();  // this method doesn't exist
    }
}

有效

注意:

  • 整个代码可以复制并粘贴到单个 IDE 文件中并运行并具有必要的 main 方法,这两者都需要它成为 MCVE
  • 我已重命名 Window 类以避免命名冲突和与java.awt.Window类混淆
  • 您的代码调用 Main 类的.start()方法,该方法未显示。这会引起问题吗?

推荐阅读