显示JFrame后如何更改它的内容(java) [英] how to change the contents of a JFrame after it has been displayed (java)
问题描述
我正在设计一个GUI以模拟Nurikabe游戏(说明此处).我基本上有两个JPanel,单击控制面板(面板2)中的一个按钮时,我想更改游戏面板(面板1)中的按钮.
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).
面板1有36个按钮,它们都是显示在GridLayout中的按钮,这些按钮是显示数字的不可单击按钮,或者是可单击的空白按钮.
Panel 1 has 36 buttons, either non-clickable buttons displaying numbers or clickable blank buttons, all contained in a GridLayout.
面板2具有三个按钮:新拼图,检查拼图和重置当前拼图.
Panel 2 has three buttons, new puzzle, check puzzle, and reset current puzzle.
我遇到的问题是,当我单击重置或新的拼图按钮时,如果不显示新窗口,我无法弄清楚如何更改面板1的按钮.
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);
}
}
推荐答案
// 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);
}
});
这篇关于显示JFrame后如何更改它的内容(java)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!