【问题标题】:how to change the contents of a JFrame after it has been displayed (java)显示后如何更改 JFrame 的内容(java)
【发布时间】:2011-04-23 11:27:06
【问题描述】:

我正在设计一个 GUI 来模拟 Nurikabe 游戏(描述 here)。我基本上有两个 JPanel,当点击控制面板(面板 2)中的一个按钮时,我想更改游戏面板(面板 1)中的按钮。

面板 1 有 36 个按钮,要么是显示数字的不可点击按钮,要么是可点击的空白按钮,它们都包含在 GridLayout 中。

面板 2 有三个按钮,新拼图、检查拼图和重置当前拼图。

我遇到的问题是,当单击重置或新拼图按钮而无需显示新窗口时,我无法弄清楚如何更改面板 1 的按钮。

有没有办法做到这一点?

代码:(我已移除检查拼图和重置拼图按钮)

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);
}
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE。另请注意,SSCCE 不会有“36”按钮,而只有几个。

标签: java jframe


【解决方案1】:
// 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);
          }
     }); 

【讨论】:

  • 所以您的意思是为所有谜题创建所有面板,然后更改它们的可见性?
【解决方案2】:

发布一些代码。

只要您引用了 JPanel 或 JButton,您就可以随意更改它们。您可以删除组件,添加组件等。

【讨论】:

    【解决方案3】:

    您可以使用CardLayout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2017-03-13
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多