Перекраска / повторная проверка JPanel не сработает

Мне неясно, как перерисовать JPanel в моем существующем коде. Я также не понимаю, как вызывается paintComponent. Во-первых, я просто хотел бы очистить JPanel, но я даже не могу этого сделать.

Я хочу иметь возможность нажать кнопку "Далее" и перекрасить JPanel с учетом изменения сетки, из которой я читаю цвета. У меня проблемы с изменением JPanel вообще с помощью вызовов, revalidate(), removeAll() и repaint() для моих плиток JPanel.

Я называю это, и ничто не происходит с существующей JPanel ниже сетки тетриса (плитки) (на фото)..

В приведенном ниже коде у меня есть вложенный класс, который расширяет JPanel, а функция установки создает окно, принимающее сетку 2-мерного массива и строящее исходную сетку.

Как мне хотя бы очистить JPanel или, что еще лучше, перерисовать с новой сеткой... Я подумал о методе:

    public void redraw(Grid g) {
        removeAll();
                    getColor(); //gets new grid of tiles
                    repaint();
        revalidate();
    }

Внутри вложенного класса JPanel, но это, похоже, не меняет JPanel, даже не очищая текущий чертеж.

Чтение тетрис доски в оригинальной сетке

 public class BoardGraphics {

    public ArrayList<ArrayList<Color>> colours;

    private final int width;

    private int height;

    private JFrame display;

    private TetrisSquares tiles;

    private Container c;

    public BoardGraphics(int width, int height,
        ArrayList<ArrayList<Integer>> grid) {
        this.width = width;
        this.height = height;
        colours = new ArrayList<ArrayList<Color>>(width);
        setColor(grid);
        setup();
    }

    public void setup() {
        System.out.println("Let the Tetris Begin");
        display = new JFrame("Tetris Agent");



        final TextArea welcome = new TextArea("Welcome to Tetris", 2, 10,
                TextArea.SCROLLBARS_NONE);

        welcome.setBackground(Color.black);
        welcome.setForeground(Color.red);
        welcome.setFont(new Font("monospaced", 0, 11));
        welcome.setEditable(false);

        Button btnStart = new Button("Next Move");
        btnStart.setFocusable(false);



        tiles = new TetrisSquares(TetrisBoard.BOARD_WIDTH, height);

        c = new Container();
        c.setLayout(new BorderLayout());
        c.add(welcome, BorderLayout.NORTH);
        c.add(tiles);
        c.add(btnStart,BorderLayout.SOUTH);

        btnStart.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
             tiles.removeAll();
             tiles.revalidate();
           }
        });


        final Container main = new Container();

        main.setLayout(new GridLayout(1, 2));
        display.add(c);



        display.pack();

        display.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        display.setVisible(true);
    }

    public ArrayList<ArrayList<Color>> getBoard() {
        return colours;
    }

    public void setColor(ArrayList<ArrayList<Integer>> grid) {
        ListIterator<Integer> li;

        for (int i = 0; i < width; i++) {
            colours.add(new ArrayList<Color>());
            li = grid.get(i).listIterator();
            for (int j = 0; j <= height; j++) {
                int n = 0;
                if(li.hasNext()) {
                    n = li.next();

                }
                switch (n) {
                case 1:
                    colours.get(i).add(Color.red);
                    break;
                case 2:
                    colours.get(i).add(Color.pink);
                    break;
                case 3:
                    colours.get(i).add(Color.orange);
                    break;
                case 4:
                    colours.get(i).add(Color.yellow);
                    break;
                case 5:
                    colours.get(i).add(Color.green);
                    break;
                case 6:
                    colours.get(i).add(Color.cyan);
                    break;
                case 7:
                    colours.get(i).add(Color.blue);
                    break;
                default:
                    colours.get(i).add(Color.gray);
                    break;
                }
            }
        }
    }



    public class TetrisSquares extends JPanel {

        public int width;
        public int height;

        public TetrisSquares(int width, int height) {
            this.width = width;
            this.height = width;
            this.setPreferredSize(new Dimension(width * 20, height * 20));
        }

        public void redraw() {
            removeAll();
            //add your elements
            //revalidate();
            //repaint();
        }


        public void paintComponent(Graphics g) {

            super.paintComponent(g);

            Graphics2D graphics = (Graphics2D) g;
            graphics.setColor(Color.BLACK);
            /*
             * tiles.width = getSize().width / width; tiles.height =
             * getSize().height / 800;
             * 
             * insets.left = (getSize().width - width * tiles.width) / 2;
             * insets.right = insets.left; insets.top = 0; insets.bottom =
             * getSize().height - height * tiles.height;
             */
            Dimension size = getSize();
            Insets insets = getInsets();

            int w = size.width - insets.left - insets.right;
            int h = size.height - insets.top - insets.bottom;

            int tileWidth = w / width;
            int tileHeight = w / width;

            ListIterator<Color> li;

            for (int i = 0; i < width; i++) {
                li = colours.get(i).listIterator();
                int n = 20;

                while(li.hasNext()) {
                    --n;
                    int x = (int) (i * tileWidth);
                    int y = (int) (n * tileHeight);
                    graphics.setColor(li.next());
                    graphics.fillRect(x, y, tileWidth, tileHeight);
                    graphics.setColor(Color.black);
                    graphics.drawRect(x, y, tileWidth, tileHeight);
                }
            }

        }

    }

}

1 ответ

Решение

Начните с изучения живописи в AWT и Swing, чтобы лучше понять систему рисования.

removeAll удаляет все дочерние компоненты из контейнера, это действительно не поможет вам в этой ситуации...

revalidate имеет дело с подсистемой макета и обновляет иерархию контейнера в ответ на изменения в содержимом контейнера, опять же, на самом деле не поможет...

В тебе paintComponent метод, вы ссылаетесь на ArrayList называется colours, которая используется для рисования квадратов. Вам нужно сбросить этот список, чтобы остановить paintComponent метод заполнения цветов

Ваш redaw метод должен выглядеть примерно так...

public void redraw() {
    colours.clear();
    repaint();
}
Другие вопросы по тегам