java swing将JPanel与鼠标侦听器的行col值相关联
发布时间:2020-12-15 05:07:42 所属栏目:Java 来源:网络整理
导读:我正在编写一个带有GUI的棋盘游戏,基本上我有一个10×10 GridLayout JPanel. 每个网格单元格都是正方形JPanel(我为这些JPanel使用了BorderLayout,因此边框可见). 无论如何,我想要它,以便当单击其中一个方块时,它会对boardGameGrid进行更改,这是一个导入到游
我正在编写一个带有GUI的棋盘游戏,基本上我有一个10×10 GridLayout JPanel.
每个网格单元格都是正方形JPanel(我为这些JPanel使用了BorderLayout,因此边框可见). 无论如何,我想要它,以便当单击其中一个方块时,它会对boardGameGrid进行更改,这是一个导入到游戏后端的GUI的类.说我想使用该方法 boardGameGrid.setCellCross(x,y) 当按下位置(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 https://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" + 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(); } }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |