简体   繁体   中英

how to change the contents of a JFrame after it has been displayed (java)

I am designing a GUI to emulate a Nurikabe game (description here ). I basically have two JPanels, and when one of buttons in the control panel (panel 2) is clicked, I want to change the buttons in the game panel (panel 1).

Panel 1 has 36 buttons, either non-clickable buttons displaying numbers or clickable blank buttons, all contained in a GridLayout.

Panel 2 has three buttons, new puzzle, check puzzle, and reset current puzzle.

The problem I am running into is that I cannot figure out how to change Panel 1's buttons when either the reset or new puzzle button is clicked without having to display a new window.

Is there a way to do this?

Code: (I have removed the check puzzle and reset puzzle buttons)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SSCCE extends JFrame {

private static final int[][] puzzle1 = { { 0, 1 }, { 1, 0 } };
private static final int[][] puzzle2 = { { 1, 0 }, { 0, 1 } };

private int[][] puzzle;

private JFrame frame;
private JPanel gridPanel;
private JPanel buttonPanel;

public SSCCE(final int puzzleNum) {
    frame = new JFrame("SSCCE");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    if (puzzleNum == 1) {
        puzzle = puzzle1;
    } else {
        puzzle = puzzle2;
    }

    setLayout(new BorderLayout());

    gridPanel = new JPanel(new GridLayout(2, 2));
    for (int i = 0; i < this.puzzle.length; i++) {
        for (int j = 0; j < this.puzzle[0].length; j++) {
            JButton button;
            if (this.puzzle[i][j] > 0) {
                button = new JButton("" + this.puzzle[i][j]);
            } else {
                button = new JButton();
                button.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        JButton temp = ((JButton) event.getSource());
                        if (temp.getBackground() == Color.BLACK) {
                            // if the button is black, set it to white
                            temp.setBackground(Color.WHITE);
                        } else if (temp.getBackground() == Color.WHITE) {
                            // if the button is white, set it to black
                            temp.setBackground(Color.BLACK);
                        }
                    }
                });
            }
            button.setBorderPainted(false);
            button.setContentAreaFilled(false);
            button.setOpaque(true);
            button.setBackground(Color.WHITE);

            gridPanel.add(button);
        }
    }

    buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

    JButton changePuzzle = new JButton("New Puzzle");
    changePuzzle.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            loadNewPuzzle(puzzleNum);
        }
    });

    buttonPanel.add(changePuzzle);

    add(gridPanel, BorderLayout.CENTER);
    add(buttonPanel, BorderLayout.SOUTH);
    setTitle("SSCCE");
    setLocation(100, 100);
    pack();
    setSize(150, 150);
}

private void loadNewPuzzle(int puzzleNum) {
    if (puzzleNum == 1) {
        puzzleNum = 2;
    } else {
        puzzleNum = 1;
    }

    // I know this is the wrong way to do it, but I'm not sure how
    // to do it.
    SSCCE newGame = new SSCCE(puzzleNum);
    newGame.setVisible(true);
}

public static void main(String[] args) {
    SSCCE game = new SSCCE(1);
    game.setVisible(true);
}
}

Post some code.

As long as you have references to the JPanels or JButtons, you are free to change them as you see fit. You can remove components, add components etc.

您可以使用CardLayout

// suppose you want to make button 2 visible and hide button 1 in panel 1 on clicking 
//   button  3 from panel 2, you can do something like this:

// add everything you want to display or not in respective panels.
// Then the contents that you dont want to get displayed,make them invisible by calling
   setVisible(false).
// Then for button 3 in panel 2, write actionlistener like this:
     button3.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
              // make the visible buttons invisible by using setVisible(false);
              // make the invisible buttons visible by using setVisible(true);
          }
     }); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM