0

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

然而......这是问题开始的地方。我能够做到这一点,但是有多个(范围可以从 9 到 729)这样的 JPanel 需要更改。我可以在 JFrame 中做到这一点没问题......但是我目前面临的问题是,虽然一个 JPanel 已正确替换,但当我执行下一个 JPanel 时,它也已正确替换。但是,经过多次测试后,我发现当通过将 JFrame 拖放到屏幕上或任何其他此类更改来刷新 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);
4

2 回答 2

1

您应该使用CardLayoutThe CardLayout class manages two or more components (usually JPanel instances) that share the same display space.

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

链接: http ://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

代码:

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

调用 JPanel 显示:

 CardLayout cl = (CardLayout)(cards.getLayout());
 cl.show(cards, BUTTONPANEL);
于 2013-03-20T12:01:28.847 回答
0

我发现,当通过将 JFrame 拖放到屏幕上或任何其他此类更改来刷新 JFrame 时,旧更改的 JPanel 消失了

嗯...在您重新调整 JFrame 等大小后,自动调用 UI repaint() 方法似乎很自然:)

感谢搜索并找到 revalidate() 方法和 repaint() 方法,我成功地删除了 JPanel

很奇怪,你只为 graphics2d 指出你的代码策略:S 如果你不需要每次都绘制一个新的 UI,而是保留它们,正如我所知道的那样,在堆中初始化而不是重新初始化设置为你的JPanel (?充当画布) ......

实际上,如果您希望同时启动所有 JPanel,并且只是通过某个事件一个一个地获取它们,您可以简单地使用某种存储作为 Map 或 List 等,将它们全部(不可见)添加到您的 '画布'最好是 FlowLayout 管理器,并通过事件使所需的一个可见/不可见,例如......

您尝试实现的主要任务仍然不是很清楚,因为您使用 Graphics2D 重音所以也许您尝试实现其他效果?:S

PS无论如何,最好显示问题代码片段,因为您当前的问题包含的信息太少了......

编辑

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

好的...这就是您向画布添加组件的方式...如我所见,Board中的数组是静态对象...我可能会建议,您有多个画布对象?如果是,那自然是miniwin(s)消失了,因为静态数组不能同时被两个调用者共享访问;所以我可能建议您不要在您的情况下使用静态字段...请阅读Java 语言规范以获取更多详细信息


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


报告是否有帮助

于 2013-03-20T19:09:52.687 回答