简体   繁体   English

显示JFrame后如何更改它的内容(java)

[英]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 ). 我正在设计一个GUI以模拟Nurikabe游戏( 在此处进行描述)。 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). 我基本上有两个JPanels,当单击控制面板(面板2)中的一个按钮时,我想更改游戏面板(面板1)中的按钮。

Panel 1 has 36 buttons, either non-clickable buttons displaying numbers or clickable blank buttons, all contained in a GridLayout. 面板1有36个按钮,它们是显示在数字中的不可单击的按钮,或可单击的空白按钮,全部包含在GridLayout中。

Panel 2 has three buttons, new puzzle, check puzzle, and reset current puzzle. 面板2具有三个按钮,新拼图,检查拼图和重置当前拼图。

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. 我遇到的问题是,当单击重置按钮或新拼图按钮时,我不必弄清楚如何更改面板1的按钮,而不必显示新窗口。

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. 只要您引用了JPanels或JButton,就可以随意更改它们。 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);
          }
     }); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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