Изменение цвета меньших JPanels на панели - PullRequest
1 голос
/ 13 марта 2019

У меня проблема с использованием 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) {
        }
    }

Ожидаемый результат - Что я хотел бы сделать с этим, как только одна из красных или белых панелей нажата, она вызывает mouseClicked переопределяет и устанавливает цвет этой панели черным (в настоящее время установлен случайный rgb, но все равно не работает), так что пользователь знает, что это было нажато.Остальные переопределения оставлены пустыми, так как в данный момент они мне не нужны.

Текущий результат - Программа выполняется, но цвета панели не меняются после щелчка.

Вот файл прямого изображения того, как программа выглядит в данный момент:

example

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 марта 2019

Возможно, есть лучшие способы сделать то, что вы хотите, но один из них - создать пользовательский класс 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];

Вы можете создать массив пользовательских JPanel s:

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

Все пользовательские JPanel имеют свои MouseListener, поэтому при нажатии на них происходит обновление.

...