在Java中遇到Click Listener问题

问题描述 投票:0回答:1

我在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的主类的第一部分。

java swing awt mouselistener
1个回答
0
投票

你正在创建一个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文件中并运行并具有必要的主要方法,它们都需要成为MCVE
  • 我重命名了Window类,以避免命名冲突并与java.awt.Window类混淆
  • 您的代码调用Main类的.start()方法,这是一种未显示的方法。这可能导致问题吗?
© www.soinside.com 2019 - 2024. All rights reserved.