Java 更改窗格中较小JPanel的颜色

Java 更改窗格中较小JPanel的颜色,java,jpanel,Java,Jpanel,我在使用MouseListener来更改面板的颜色时遇到问题,该面板是行和列中许多其他类似面板中的一个。这是我目前的进展: import java.awt.*; import javax.swing.*; import java.awt.Color.*; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.util.Random; p

我在使用
MouseListener
来更改面板的颜色时遇到问题,该面板是行和列中许多其他类似面板中的一个。这是我目前的进展:

import java.awt.*;
    import javax.swing.*;
    import java.awt.Color.*;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    import java.util.Random;

    public class Checkers extends JFrame implements MouseListener
    {
        Random random = new Random();
        private final int ROWS = 2;
        private final int COLS = 5;
        private final int GAP = 2;
        private final int NUM = ROWS * COLS;
        private int x;
        private JPanel pane = new JPanel(new GridLayout(ROWS,COLS, GAP,GAP));
        private JPanel pane2 = new JPanel();

        private JPanel [] panel = new JPanel[NUM];
        private Color col1 = Color.RED;
        private Color col2 = Color.WHITE;
        private Color tempColor;

        public Checkers()
        {
            super("Checkers");
            setSize(600,600);
            setVisible(true);
            addMouseListener(this);
            mouseClicked(null);
            setBackground(Color.BLACK);
            setBoard();
        }

        public void setBoard()
        // rotates colors on the checkbaord
        {

            for(int x = 0; x < NUM; x++) {
                panel[x] = new JPanel();
                pane.add(panel[x]);
                if (x % COLS == 0) {
                    tempColor = col1;
                    col1 = col2;
                    col2 = tempColor;}
                if (x % 2 == 0) {
                    panel[x].setBackground(col1);}
                else {
                    panel[x].setBackground(col2);}
            }

            //pane background colour and the size of this pane.
            pane.setBackground(Color.BLACK);
            pane.setPreferredSize(new Dimension(300,300));


            //pane background colour and size of this pane.
            pane2.setBackground(Color.BLACK);
            pane2.setPreferredSize(new Dimension(300,300));

            //directions on the board where these panes appear.
            add(pane, BorderLayout.WEST);
            add(pane2, BorderLayout.EAST);

            pane2.setLayout(new BoxLayout(pane2, BoxLayout.PAGE_AXIS));
        }

        @Override
        public void mouseClicked(MouseEvent arg0) {

            //randomly generate a new color for one of the panes when that pane is clicked.
            int r = random.nextInt(255);
            int g = random.nextInt(255);
            int b = random.nextInt(255);
            setBackground(new Color(r, g, b));
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {        
        }

        @Override
        public void mouseExited(MouseEvent arg0) {
        }

        @Override
        public void mousePressed(MouseEvent arg0) {
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
        }
    }
import java.awt.*;
导入javax.swing.*;
导入java.awt.Color.*;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseEvent;
导入java.util.Random;
公共类检查器扩展JFrame实现MouseListener
{
随机=新随机();
私有最终整数行=2;
私人最终整数=5;
私人最终积分差距=2;
私有最终整数=行*列;
私人INTX;
私有JPanel窗格=新JPanel(新网格布局(行、列、间隙、间隙));
private JPanel pane2=new JPanel();
私有JPanel[]面板=新JPanel[NUM];
专用颜色col1=Color.RED;
专用颜色col2=Color.WHITE;
私人色彩;
公共跳棋
{
超级(“跳棋”);
设置大小(600600);
setVisible(真);
addMouseListener(这个);
鼠标点击(空);
挫折背景(颜色:黑色);
立根板();
}
公众谘询委员会(
//旋转复选框上的颜色
{
对于(int x=0;x
预期结果-我想做的是,一旦单击其中一个红色或白色面板,它会触发
鼠标点击
覆盖,并将该面板的颜色设置为黑色(当前设置为随机rgb,但无论如何都不起作用),因此用户知道该面板已按下。其余的覆盖是空的,因为它们在此刻对我没有任何作用

当前结果-程序执行,但单击后窗格颜色不会改变

以下是程序当前执行时的直接映像文件:


欢迎提供任何帮助。

可能有更好的方法来做您想要做的事情,但其中一种方法是创建自定义
JPanel
类:

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class MyPanel extends JPanel implements MouseListener {

    public MyPanel() {
        addMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        setBackground(Color.BLACK);
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {   
    }

    @Override
    public void mouseEntered(MouseEvent e) {    
    }

    @Override
    public void mouseExited(MouseEvent e) { 
    }
}
然后,不创建常规
JPanel
s数组:

private JPanel[] panel = new JPanel[NUM];
private MyPanel[] panel = new MyPanel[NUM];
您可以创建自定义
JPanel
s的数组:

private JPanel[] panel = new JPanel[NUM];
private MyPanel[] panel = new MyPanel[NUM];

自定义
JPanel
s都有自己的
MouseListener
s,因此当单击其中一个时,它会自动更新。

可能有更好的方法来做您想做的事情,但一种方法是创建自定义
JPanel
类:

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class MyPanel extends JPanel implements MouseListener {

    public MyPanel() {
        addMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        setBackground(Color.BLACK);
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {   
    }

    @Override
    public void mouseEntered(MouseEvent e) {    
    }

    @Override
    public void mouseExited(MouseEvent e) { 
    }
}
然后,不创建常规
JPanel
s数组:

private JPanel[] panel = new JPanel[NUM];
private MyPanel[] panel = new MyPanel[NUM];
您可以创建自定义
JPanel
s的数组:

private JPanel[] panel = new JPanel[NUM];
private MyPanel[] panel = new MyPanel[NUM];

自定义的
JPanel
s都有自己的
MouseListener
s,因此当单击其中一个时,它会自动更新。

作为旁注,变量
NUM
的使用不太具有描述性。您可能希望选择更好的变量名。请注意这一点,谢谢。
setBackground(新颜色(r,g,b))
将设置您正在运行的
检查器
实例的背景。相反,您希望更改已单击面板的背景。因此,最简单的方法(从设计角度来看,我会采取不同的做法)是在每个互动程序(较小的面板)上注册鼠标侦听器,并调用
((JComponent)event.getSource()).setBackground(Color.BLACK)
。更好的设计可能会使用一个模型来存储已单击的磁贴,然后渲染磁贴将使用该模型(这可能需要调整磁贴的渲染器)。作为旁注,变量
NUM
的使用不太具有描述性。您可能希望选择更好的变量名。请注意这一点,谢谢。
setBackground(新颜色(r,g,b))
将设置您正在运行的
检查器
实例的背景。相反,您希望更改已单击面板的背景。因此,最简单的方法(从设计角度来看,我会采取不同的做法)是在每个互动程序(较小的面板)上注册鼠标侦听器,并调用
((JComponent)event.getSource()).setBackground(Color.BLACK)
。一个更好的设计可能会使用一个模型来存储单击的瓷砖,然后渲染瓷砖就会使用该模型(这可能需要调整瓷砖的渲染器)