【问题标题】:Having Problem With Click Listener in JavaJava 中的 Click Listener 出现问题
【发布时间】:2019-07-09 01:04:25
【问题描述】:

我正在用 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

【问题讨论】:

  • 这个问题真的需要minimal reproducible example 才能让我们更好地理解您的代码和您的问题。您还需要更好地解释您想要实现的目标。

标签: java swing awt mouselistener


【解决方案1】:

你正在创建一个 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() 方法,该方法未显示。这会导致问题吗?

【讨论】:

  • @Procode238:由于您不知道问题出在哪里或为什么会发生,因此假设什么是必要的,什么不是,这是不明智的。当询问行为不正常的代码时,最好(再次)发布minimal reproducible examplealways。请阅读/研究这个重要的链接,了解一个非常有用的工具。
  • @Procode238:请在发布更多代码之前阅读mcve链接,因为它对您和我们都有帮助。
  • @Procode238:再次,请在您发布 MCVE 后发表评论。同时,请查看我的answer here 以了解类似情况。
  • 感谢您的回复。希望 MCVE 问题应该得到解决,因为我已经发布了我理解为 MCVE 的内容。再次感谢您,期待您以后的任何回复。
  • 你的意思是你没有main方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多