Метод MouseClicked () не работает для алгоритма поиска пути? - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь написать алгоритм поиска пути, чтобы попытаться внедрить A * в интерфейс JPanel. Код выглядит следующим образом. Как вы можете видеть, я случайным образом генерирую цвет квадратов для лабиринта, используя генератор случайных чисел. Ниже приведена элементарная реализация исходного кода:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner; 
import java.util.Random;


public class algo extends JPanel
implements MouseListener, MouseMotionListener
{


static int[][] map;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    this.setBackground(Color.WHITE);

    //draw a for loop to print the map
    for (int i = 0; i < map.length; i++) {
        for(int j = 0; j < map[i].length; j++) {
            g.setColor(Color.WHITE);

            if(map[i][j] == 1) {
                g.setColor(Color.BLACK);
            }

            g.fillRect(j * 20, i * 20, map[i].length * 20, map.length *20);

        }
    }

}

public static void main(String[] args) {
    System.out.println("Welcome to the A* Shortest Pathfinding Robot Program \n *****"
            + "**************************"
            + "********************\n");
    System.out.println("How large would you like your graph to be? Enter 2 consecutive numbers, one for length, one for width:\n");
    Scanner sizeScan = new Scanner(System.in);
    int length = sizeScan.nextInt();
    int width = sizeScan.nextInt();
    map = new int[length][width];
    Random gridGenerate = new Random();
    for(int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[i].length; j++) {
            map[i][j] = gridGenerate.nextInt(2);
            System.out.print(map[i][j] + " ");
        }
        System.out.println();

    }
    JFrame f = new JFrame("A Star Pathfinder");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    algo star = new algo();
    f.add(star);
    f.setSize(length * 20, width * 20);
    f.setVisible(true);

}

@Override
public void mouseDragged(MouseEvent e) {}

@Override
public void mouseMoved(MouseEvent e) {}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("Successfully Clicked");
    if (SwingUtilities.isLeftMouseButton(e)) {
        System.out.println("This is the left mouse button that is clicked");
    }
    }



@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}

@Override
public void mousePressed(MouseEvent e) {}

@Override
public void mouseReleased(MouseEvent e) {}

}

Когда я запустил метод main (), я смог успешно сгенерировать лабиринт:

Вот "Лабиринт", сгенерированный из кода

Однако, когда я попытался реализовать действие MouseClick () в лабиринте, ничего не произошло. У меня есть операторы печати, чтобы попытаться проверить это, и каждое возможное решение не решило проблему.

  1. Попытка реализовать метод run () внутри основного кода
  2. Попытка реализовать метод run () внутри класса
  3. Попытка создать класс закрытого обработчика?

Есть еще идеи, почему mouseHandler не отвечает на мои запросы?

1 Ответ

0 голосов
/ 10 марта 2019

Вы должны явно добавить слушатель мыши в JPanel.

public class algo extends JPanel implements MouseListener, MouseMotionListener {

    public algo() {
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }
    // other stuff
}
...