Java 刷新jFrame时,旧的jPanel将消失

Java 刷新jFrame时,旧的jPanel将消失,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在编写一个紧张的游戏,有一个重要的问题。在这个游戏中,由于搜索并找到了revalidate()方法和repaint()方法,我成功地删除了一个JPanel并将另一个JPanel放在它的位置 然而。。。问题就从这里开始。我能够做到这一点,但有多个(范围从9到729)这样的JPanel需要更改。我可以在JFrame中这样做没有问题。。。然而,我目前面临的问题是,虽然一个JPanel被正确替换,但当我执行下一个JPanel时,它也被正确替换。然而,在多次测试之后,我发现当JFrame通过在屏幕上来

我正在编写一个紧张的游戏,有一个重要的问题。在这个游戏中,由于搜索并找到了
revalidate()
方法和
repaint()
方法,我成功地删除了一个
JPanel
并将另一个
JPanel
放在它的位置

然而。。。问题就从这里开始。我能够做到这一点,但有多个(范围从9到729)这样的JPanel需要更改。我可以在JFrame中这样做没有问题。。。然而,我目前面临的问题是,虽然一个JPanel被正确替换,但当我执行下一个JPanel时,它也被正确替换。然而,在多次测试之后,我发现当JFrame通过在屏幕上来回拖动或任何其他类似更改来刷新时,旧的更改过的jpanel就会消失

有没有什么方法可以使新添加的JPanel永久存在,而不是在JFrame刷新时消失

代码如下:

int a = f%27;
int b = g%27;
int c = a%9;
int d = b%9;
winningletter.setFont(new Font("Times New Roman", Font.BOLD, 17));
miniwin.add(winningletter);
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).removeAll();
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).setLayout(new GridLayout(1,1));
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).add(miniwin);
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).repaint();
metametametaminiminiwincheck[f/3][g/3]=winningletter.getText();
boardChanger(f, g, 4);
WinChecker(s, f,g,3,4,metametametaminiminiwincheck,x);

您应该使用CardLayout
CardLayout类管理共享相同显示空间的两个或多个组件(通常是JPanel实例)。

它允许您以专业方式在面板之间翻转。每个JPanel都有一个ID,您可以使用它来显示它

链接:

代码:

//Where instance variables are declared:
JPanel cards;
final static String BUTTONPANEL = "BUTTONPANEL";
final static String TEXTPANEL = "TEXTPANEL";

//Where the components controlled by the CardLayout are initialized:
//Create the "cards".
JPanel card1 = new JPanel();
JPanel card2 = new JPanel();

//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);
 CardLayout cl = (CardLayout)(cards.getLayout());
 cl.show(cards, BUTTONPANEL);
调用JPanel显示:

//Where instance variables are declared:
JPanel cards;
final static String BUTTONPANEL = "BUTTONPANEL";
final static String TEXTPANEL = "TEXTPANEL";

//Where the components controlled by the CardLayout are initialized:
//Create the "cards".
JPanel card1 = new JPanel();
JPanel card2 = new JPanel();

//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);
 CardLayout cl = (CardLayout)(cards.getLayout());
 cl.show(cards, BUTTONPANEL);
我发现当JFrame通过来回拖动刷新时 在屏幕上或任何其他类似的更改中,旧的更改JPanel将消失

嗯。。。在重新调整JFrame等的大小后,UI repaint()方法似乎自然会被自动调用。)

由于搜索并找到了revalidate()方法和 方法我成功地删除了一个JPanel

非常奇怪的是,如果您不需要每次都绘制一个新的UI,而是保留它们,那么您只针对graphics2d指定代码策略,而不是重新初始化设置到您的JPanel(?充当画布)

事实上,如果你想同时初始化所有JPanel,并通过某个事件逐个获取它们,你可以简单地使用某种存储作为映射或列表等,将它们全部(不可见)添加到你的“画布”中,最好是FlowLayout管理器,并通过事件使所需的一个可见/不可见,例如

不过,您试图实现的主要任务还不太清楚,因为您确实需要强调图形2d,所以您可能试图实现另一种效果:

附言。 无论如何,最好是显示问题代码段,因为您当前的问题包含的信息比现在少

编辑

((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).removeAll();
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).setLayout(new GridLayout(1,1));
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).add(miniwin);
((JPanel)((JPanel)newDossier.Board.metametametaboard[f/27][g/27].getComponent((a/9)*3+b/9)).getComponent((c/3)*3+d/3)).repaint();
好的。。。这就是如何将组件添加到画布中。。。正如我所看到的,板中的数组是静态的对象。。。我可以建议,您有多个画布对象?如果是,它自然会消失,因为静态数组不能同时由两个调用程序共享访问;因此,我建议在您的情况下不要使用静态字段。。。请阅读更多详细信息


如果您有其他问题详细信息,请发表评论



如果没有相关代码,我们只能推测,报告是否有用。编程之神会因此惩罚我们:我们的键盘会消失,我们会被触摸屏困住,对于我们这样的人来说,这就像强迫迈克尔·舒马赫驾驶电动汽车(甚至不是混合动力车)一样。信息太少:我们需要源代码来了解问题所在。。。你的面板是静态的吗?@user2190592我编辑了我的答案。请看,好吗。。。我让杰帕内尔去工作。。。我唯一的问题是如何检索显示的面板?例如如何找到卡片1使用cards.getShow()或类似的东西进行操作??首先,您必须将问题标记为已回答,以便其他用户可以从答案中受益。若要获取活动面板,应在调用show方法时使用存储字符串的全局变量。例如:cl.show(卡片、按钮面板);字符串currentPanel=BUTTONPANEL;不不如何检索cl.show()中未使用的面板。。。就像找到闹钟一样。。。喜欢card.getComponent(1)什么的?你好Alexi。。。非常感谢你回答我的问题。。。但即使我申请cl.show(卡片,“文本面板”);没有什么变化。。。为什么???它区分大小写。。按照我提供的链接中的教程进行操作。