加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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();
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读