刷新jFrame时,较旧的jPanel会消失

时间:2013-03-20 11:31:03

标签: java swing jframe jpanel

我正在编写一个激烈的游戏,并有一个重要的问题。在此游戏中,由于搜索并找到了revalidate()方法和repaint()方法,我成功移除了JPanel并在其中放置了另一个JPanel

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

有没有什么方法可以让新添加的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);

2 个答案:

答案 0 :(得分:1)

您应该使用 CardLayout The 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);

答案 1 :(得分:0)

  

我发现当JFrame通过拖动它来刷新时   在屏幕上或任何其他此类更改中,旧的更改JPanels消失

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

  

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

很奇怪你只为graph2d指出你的代码策略:S如果你不是每次都需要绘制一个新的UI,而是保持它们,就像我可以得到它一样,in in in堆不重新初始化以设置到您的JPanel (?作为画布) ......

实际上,如果你想让所有的JPanel同时出现并且只是通过某种事件逐个获取它们,你可以简单地使用某种存储作为Map或List等,将它们全部添加(不可见)对你的'画布'最好的FlowLayout经理,并使一个事件可见/不可见,例如......

你试图实现的主要任务还不是很清楚,因为你强调了Graphics2D,所以也许你试图实现另一种效果? :S

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

修改

((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 中的数组是 static object ...我可能会建议你有多个画布对象?如果是,那么 miniwin(s) 自然会消失,因为静态数组一次不能由两个调用者共享访问权限;所以我建议您不要使用静态字段...请阅读The Java Language Specification以获取更多详细信息


如果您有其他问题,请发表评论


报告是否有用