Проблема с JFrame и MouseListener, неправильно выполняющими щелчок - PullRequest
0 голосов
/ 10 января 2020

У меня возникла проблема, когда моя сетка печатается очень хорошо, и когда я выделяю поле, оно превращается в нужный мне цвет, однако при нажатии на одно из полей оно не становится красным, и я не могу показаться чтобы выяснить, почему кто-то может помочь:)

Обязательно посмотрите на функции InBoxX (), InBoxY (), а также MouseClicked и l oop в классе Board, который выводит все.

 import javax.swing.*;
 import java.util.*;
 import java.awt.*;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 public class GUI extends JFrame {
    public int mx = -100;
    public int my = -100;
    int spacing = 2;
    public boolean[][] Nodes = new boolean[32][18];

    public GUI(){

        this.setTitle("Test");
        this.setSize(1286 , 829);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setResizable(false);

        Board board = new Board();
        this.setContentPane(board);

        Move move = new Move();
        this.addMouseMotionListener(move);

        Click click = new Click();
        this.addMouseListener(click);

    }
    public class Board extends JPanel {
        public void paintComponent(Graphics g){
            g.setColor(Color.DARK_GRAY);
            g.fillRect(0 , 0 , 1280 , 800);
            for ( int i = 0 ; i < 32 ; i++){
                for (int j = 0 ; j < 18 ; j++){
                    Nodes[i][j] = false;
                    if(Nodes[i][j] == true){
                        g.setColor(Color.red);
                    }
                    g.setColor(Color.gray);
                 if( mx >= spacing+i*40 && mx < spacing+i*40+40-spacing && 
                         my >= spacing+j*40+40+26 &&
                         my < spacing+j*40+26+40+40-2*spacing ){
                     g.setColor(Color.yellow);
                 }
                    g.fillRect(spacing+i*40, spacing+j*40+40, 40-2*spacing, 40-2*spacing);
                }
            }
        }


    }

    public class Move implements MouseMotionListener {

        @Override
        public void mouseDragged(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            mx = e.getX();
            my = e.getY();
        }

    }
    public class Click implements MouseListener {

        @Override
        public void mouseClicked(MouseEvent e) {
            if(InBoxX() != -1 && InBoxY() != -1){
                Nodes[InBoxX()][InBoxY()] = true;
                System.out.println("Clicked");
            }
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        public int InBoxX(){
            for ( int i = 0 ; i < 32 ; i++){
                for( int j = 0 ; j < 18 ; j++){
                    if(mx >= spacing+i*40 && mx < spacing+i*40+40-spacing && 
                         my >= spacing+j*40+40+26 &&
                         my < spacing+j*40+26+40+40-2*spacing){
                        return i;
                    }
                }
            }
            return -1;
        }

        public int InBoxY(){
            for ( int i = 0 ; i < 32 ; i++){
                for (int j = 0 ; j< 18 ; j++){
                    if(mx >= spacing+i*40 && mx < spacing+i*40+40-spacing && 
                         my >= spacing+j*40+40+26 &&
                         my < spacing+j*40+26+40+40-2*spacing){
                        return j;
                    }
                }
            }
            return -1;
        }
    }
}

1 Ответ

0 голосов
/ 10 января 2020

Это из-за отсутствия лучшего слова: грязный . Некоторые выводы:

  1. Выполнить java качание GUI из EDT (нити диспетчеризации событий).
  2. Не расширять JFrame - обычно, когда вы расширяете что-то, что вы создаете «лучшую» версию, вам просто нужен экземпляр здесь.
  3. Вы пытаетесь вычислить положение мыши и оттуда выяснить, что рисовать - почему бы и нет просто зарегистрировать действие или слушателя для каждого квадрата и сделать так, чтобы он сам рисовал?

С учетом вышесказанного - ваш отредактированный код ниже закрасит квадрат в красный клик. Из вашего вопроса не ясно, ищите ли вы такое поведение.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public int mx = -100;
    public int my = -100;
    int spacing = 2;
    public boolean[][] Nodes = new boolean[32][18];

    Board board;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Test();
            }
        });
    }

    public Test() {
        JFrame frame = new JFrame("Test");

        frame.setSize(1286 , 829);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);

        board = new Board();
        frame.add(board);

        Move move = new Move();
        frame.addMouseMotionListener(move);

        Click click = new Click();
        frame.addMouseListener(click);
    }

    @SuppressWarnings("serial")
    public class Board extends JPanel {

        public void paintComponent(Graphics g){
            g.setColor(Color.DARK_GRAY);
            g.fillRect(0 , 0 , 1280 , 800);

            for (int i = 0 ; i < 32 ; i++) {
                for (int j = 0 ; j < 18 ; j++) {
                    //Nodes[i][j] = false;


                    g.setColor(Color.gray);

                    if(mx >= spacing + i*40 &&
                       mx < spacing + i*40 + 40 - spacing && 
                       my >= spacing + j*40 + 40 + 26 &&
                       my < spacing + j*40 + 26 + 40 + 40 - 2*spacing ) {
                        g.setColor(Color.red);
                 }
                    g.fillRect(spacing+i*40, spacing+j*40+40, 40-2*spacing, 40-2*spacing);
                }
            }
        }
    }

    public class Move implements MouseMotionListener {

        @Override
        public void mouseDragged(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            mx = e.getX();
            my = e.getY();
        }
     }

    public class Click implements MouseListener {

        @Override
        public void mouseClicked(MouseEvent e) {
            if(InBoxX() != -1 && InBoxY() != -1){
                Nodes[InBoxX()][InBoxY()] = true;
                System.out.println("Clicked");
                board.repaint();
            }
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        public int InBoxX() {
            for ( int i = 0 ; i < 32 ; i++){
                for( int j = 0 ; j < 18 ; j++){
                    if(mx >= spacing+i*40 && mx < spacing+i*40+40-spacing && 
                         my >= spacing+j*40+40+26 &&
                         my < spacing+j*40+26+40+40-2*spacing){
                        return i;
                    }
                }
            }

            return -1;
        }

        public int InBoxY(){
            for ( int i = 0 ; i < 32 ; i++){
                for (int j = 0 ; j< 18 ; j++){
                    if(mx >= spacing+i*40 && mx < spacing+i*40+40-spacing && 
                         my >= spacing+j*40+40+26 &&
                         my < spacing+j*40+26+40+40-2*spacing){
                        return j;
                    }
                }
            }

            return -1;
        }
    }
}

...