gpt4 book ai didi

java swing 将 JPanel 与鼠标监听器的行 col 值相关联

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:30:50 27 4
gpt4 key购买 nike

我正在编写带有 GUI 的棋盘游戏,基本上我有一个 10x10 GridLayout JPanel。

每个网格单元都是一个方形 JPanel(我为这些 JPanel 使用了 BorderLayout,因此边框可见)。

无论如何,我想要这样,当这些方 block 中的一个被点击时,它会对 boardGameGrid 进行更改,这是一个导入到游戏后端 GUI 的类。说我要用方法

boardGameGrid.setCellCross(x,y)

当位置 (x,y) 的单元格被按下时。

我不知道该怎么做,因为每个 JPanel 都不包含有关其位置的任何信息。

谢谢

最佳答案

您必须将此 JPanels 准备为 Object 并将其放入 Map 或 List,基于伟大但简单的想法的简单示例

enter image description here enter image description here enter image description here

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.border.LineBorder;
//based on @trashgod code from http://stackoverflow.com/a/7706684/714968
public class FocusingPanel extends JFrame {

private static final long serialVersionUID = 1L;
private int elements = 10;
private List<GridPanel> list = new ArrayList<GridPanel>();
private final JFrame mainFrame = new JFrame();
private final JPanel fatherPanel = new JPanel();

public FocusingPanel() {
fatherPanel.setLayout(new GridLayout(elements, elements));
for (int i = 0; i < elements * elements; i++) {
int row = i / elements;
int col = i % elements;
GridPanel gb = new GridPanel(row, col);
list.add(gb);
fatherPanel.add(gb);
}
mainFrame.setLayout(new BorderLayout(5, 5));
mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
mainFrame.add(fatherPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);
}

private GridPanel getGridPanel(int r, int c) {
int index = r * elements + c;
return list.get(index);
}

private class GridPanel extends JPanel {

private int row;
private int col;

@Override
public Dimension getPreferredSize() {
return new Dimension(20, 20);
}

public GridPanel(int row, int col) {
this.row = row;
this.col = col;
this.setBackground(Color.red);
this.setBorder(new LineBorder(Color.black,1));
this.addMouseListener(new MouseListener() {

@Override
public void mouseClicked(MouseEvent e) {
int r = GridPanel.this.row;
int c = GridPanel.this.col;
GridPanel gb = FocusingPanel.this.getGridPanel(r, c);
System.out.println("r" + r + ",c" + c
+ " " + (GridPanel.this == gb)
+ " " + (GridPanel.this.equals(gb)));
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
int r = GridPanel.this.row;
int c = GridPanel.this.col;
GridPanel gb = FocusingPanel.this.getGridPanel(r, c);
System.out.println("r" + r + ",c" + c
+ " " + (GridPanel.this == gb)
+ " " + (GridPanel.this.equals(gb)));
setBackground(Color.blue);

}

@Override
public void mouseExited(MouseEvent e) {
setBackground(Color.red);
}
});
}
}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
FocusingPanel focusingPanel = new FocusingPanel();
}
});
}
}

关于java swing 将 JPanel 与鼠标监听器的行 col 值相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8941939/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com