ddr*_*er1 3 java grid swing jpanel mouselistener
我正在编写一个带有GUI的棋盘游戏,基本上我有一个10x10 GridLayout JPanel.
每个网格单元格都是正方形JPanel(我为这些JPanel使用了BorderLayout,因此边框可见).
无论如何,我想要它,以便当单击其中一个方块时,它会对boardGameGrid进行更改,这是一个导入到游戏后端的GUI的类.说我想使用该方法
boardGameGrid.setCellCross(x,y)
Run Code Online (Sandbox Code Playgroud)
当按下位置(x,y)的单元格时.
我无法弄清楚如何做到这一点,因为每个JPanel都不包含任何有关其位置的信息.
谢谢
您必须将此JPanels准备为Object并将其放入Map或List,这是一个基于简单但简单的想法的简单示例



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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |