我在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
}
}
它的工作原理
注意:
java.awt.Window
类混淆.start()
方法,这是一种未显示的方法。这可能导致问题吗?