首页 > 解决方案 > JFrame 和 MouseListener 没有正确执行点击的问题

问题描述

我遇到了这个问题,我的网格打印得很好,当我突出显示一个框时,它变成了我想要的颜色,但是当单击其中一个框时它没有变成红色,我似乎找不到为什么如果有人可以提供帮助:)

确保查看 InBoxX() 、 InBoxY() 函数以及 MouseClicked 和 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;
        }
    }
}

标签: javaswingjframeawtmouselistener

解决方案


这是,因为缺少一个更好的词:messy。一些要点:

  1. 从 EDT(事件调度线程)运行 java swing GUI。
  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;
        }
    }
}


推荐阅读