java - 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
.
解决方案
您正在创建一个 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()
方法,该方法未显示。这会引起问题吗?
推荐阅读
- javascript - JQuery window.location.assign 方法不起作用
- python - 使用 Keras Python 创建 RNN
- docker - Minikube、Kubernetes、Docker Compose、Docker Swarm 等之间的区别
- html - 将 div 固定到父级的底部
- opencl - 主机如何在汇编级别向 GPU 发送 OpenCL 内核和参数?
- html - Change image on click using Angular2
- angular - Angular cli 6安装错误
- javascript - 在 JS 中使用引导颜色
- git - 我怎样才能使 gitignore 与其他语言(如韩语)一起使用
- android - 使用共享首选项保存和检索微调器值