Как мне перерисовать эту панель с помощью Java качать?

Я действительно пытаюсь выяснить, как сделать это. Я пытаюсь создать GUI, который сбросит генератор лабиринта на кнопку; на данный момент нет лабиринта, на самом деле создается, но у меня есть анимация, которая будет работать в качестве заполнителя.

Код, который создает графический интерфейс выглядит следующим образом:

Border empty;
    empty = BorderFactory.createEmptyBorder(30, 30, 30, 30); //makes border

    JFrame frame = new JFrame("Maze Tool"); //creating main frame for gui, must have
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set it to close on "x"
    frame.setSize(500, 750); //manually sets default size
    frame.getRootPane().setBorder(empty); //adds border

    BoxLayout bx = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
    frame.setLayout(bx);

    JPanel panel = new JPanel();

    JPanel genDrop = new JPanel();
    String[] genAlgorithms = {"Depth-first search", "Randomised Kruskal's algorithm", "Recursive backtracking"};
    JComboBox genList = new JComboBox(genAlgorithms);
    genDrop.add(new JLabel("Generate maze using: "));
    genDrop.add(genList);

    JPanel animation = new JPanel();
    animation.setPreferredSize(new Dimension(420, 420));
    animation.setBackground(Color.DARK_GRAY);

    JPanel buttons = new JPanel();
    JButton genMaze = new JButton("Generate new maze");
    genMaze.setAlignmentX(JButton.CENTER_ALIGNMENT);
    genMaze.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("genMaze");
            JPanel panel = Maze.generateMaze();
            panel.setVisible(true);
            animation.add(panel);
        }
    });

    JButton solveMaze = new JButton("Solve maze");
    solveMaze.setAlignmentX(JButton.CENTER_ALIGNMENT);
    solveMaze.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });

    JButton clrMaze = new JButton("Clear solution");
    clrMaze.setAlignmentX(JButton.CENTER_ALIGNMENT);
    clrMaze.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    buttons.add(genMaze);
    buttons.add(solveMaze);
    buttons.add(clrMaze);
    buttons.setAlignmentY(JPanel.TOP_ALIGNMENT);

    JPanel solveDrop = new JPanel();
    String[] solveAlgorithms = {"Random Mouse algorithm", "Wall Follower", "Tremeaux's algorithm"};
    JComboBox solveList = new JComboBox(solveAlgorithms);
    solveDrop.add(new JLabel("Solve maze using: "));
    solveDrop.add(solveList);

    frame.add(panel);
    panel.add(genDrop);
    panel.add(Box.createRigidArea(new Dimension(0, 10)));
    panel.add(animation);
    panel.add(solveDrop);
    panel.add(Box.createRigidArea(new Dimension(0, 10)));
    panel.add(buttons);
    panel.add(Box.createRigidArea(new Dimension(0, 10)));

    frame.setVisible(true);
    frame.setResizable(false);

Лабиринт.generateMaze() здесь:

public static JPanel generateMaze() {
    JPanel panel = new Animation();
    panel.setPreferredSize(new Dimension(420, 420));

    return panel;
}

А анимация бит-это здесь:

public class Animation extends JPanel implements ActionListener {

public Timer tm = new Timer(50, this);
int x = 0;
int y = 0;
int[][] grid = new int[40][40];
Color bg;

Animation() {
    bg = this.getBackground();
    this.setBackground(Color.DARK_GRAY);
}

public void startTimer() {
    tm.start();
}

public void resetAnimation() {
    for (int i = 0; i < 40; i++){
        for (int j = 0; j > 40; j++){
            this.setBackground(Color.DARK_GRAY);
            grid[i][j] = 0;
            revalidate();
            tm.restart();
        }
    }
}

public void paint(Graphics g) {
    super.paintComponent(g);
    g.setColor(bg);
    g.fillRect(10, 0, 10, 10); // start square
    g.fillRect(400, 410, 10, 10); // end square
    for (int yy = 0; yy < 40; yy++) {
        for (int xx = 0; xx < 40; xx++) {
            if (grid[xx][yy] == 0){
                g.setColor(Color.DARK_GRAY);
                g.fillRect(xx * 10 + 10, yy * 10 + 10, 10, 10);
            } else if (grid[xx][yy] == 1) {
                g.setColor(Color.RED);
                g.fillRect(xx * 10 + 10, yy * 10 + 10, 10, 10);
            } else if (grid[xx][yy] == 2) {
                g.setColor(bg);
                g.fillRect(xx * 10 + 10, yy * 10 + 10, 10, 10);
            }
        }
    }
    tm.start();
}

public void actionPerformed(ActionEvent e) {
    if (x == 39 && y == 39){
        grid[x][y] = 2;
    }
    else if (x < 40) {
        grid[x][y] = 1;
        if (x > 0) {
            grid[x - 1][y] = 2;
        }
        x++;
    }
    else if (y < 40) {
        // note: at this point x > 39 !
        grid[x - 1][y] = 1;
        if (y > 0) {
            grid[x - 1][y - 1] = 2;
        }
        y++;
    }
    repaint();
}

Я действительно не понимаю, как сделать так, чтобы анимация сбрасывается при нажатии кнопки 'Создать новый лабиринт' нажата, я пытался поставить панели внутри панели и показывать и скрывать их, но ничего, кажется, работает.

0
2019-09-17 18:24:23
источник

Посмотрите другие вопросы по меткам