JFrame和MouseListener的问题未正确执行单击

问题描述 投票:0回答:1

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

请确保查看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;
        }
    }
}
java jframe mouselistener
1个回答
0
投票

这是因为缺少更好的词: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; } } }

  • © www.soinside.com 2019 - 2024. All rights reserved.