java - 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;
}
}
}
解决方案
这是,因为缺少一个更好的词:messy。一些要点:
- 从 EDT(事件调度线程)运行 java swing GUI。
- 不要扩展 JFrame - 通常,当您扩展某些内容时,您正在创建它的“更好”版本,您只需要在此处创建一个实例。
- 您正在尝试计算鼠标的位置,并从那里找出要绘制的内容 - 为什么不只为每个方格注册一个动作或侦听器并让它自己绘制呢?
话虽如此 - 您在下面编辑的代码将在单击时绘制一个方形红色。从您的问题中不清楚这是否是您正在寻找的行为。
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;
}
}
}
推荐阅读
- webgl - webGL gl.uniformMatrix4v 函数
- arrays - Python中以下两种初始化矩阵方式的区别
- sql - 如何编写可能来自不同表的“属于”关联?
- android - 如何在应用后台保持观察互联网访问
- heatmap - 如何在相关矩阵热图中的值旁边添加显着性星号?
- go - go模块没有正确下载动态库的cgo软链接
- php - 如何使用 FPDF 和 Retrofit 库发送用于 PDF 生成的特定参数并将其下载到 Android
- big-o - 针对会议时间问题将代码优化为 0(N)
- php - 如何为特定文件添加 .php 扩展名?
- sql - SQL Server 将行值转换为列