Возникли проблемы с прослушивателем кликов в Java - PullRequest
0 голосов
/ 15 февраля 2019

Я делаю шахматную игру в 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.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы создаете объект Handler, хорошо, вы добавляете его к объекту Canvas (this - почему Canvas?), И вы создаете объект окна «верхнего уровня», который находится вфакт типа Window, но вы никогда не добавляете Canvas в окно, и при этом вы не отображаете окно, поэтому нет никаких оснований ожидать, что этот код действительно будет работать.

Теперь, я предполагаючто существует больше кода, который вы нам не показываете, и это может иметь значение, и если это так, рассмотрите возможность создания и публикации адекватного 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
  • Ваш код вызывает метод .start() основного класса, метод не показан.Может ли это вызывать проблемы?
...