0

激しいゲームをコーディングしていて、重要な質問があります。revalidate()このゲームでは、メソッドとメソッドを検索して見つけたおかげで、あるメソッドを削除して別のrepaint()メソッドをその場所に配置することに成功しました。JPanelJPanel

しかし...ここから問題が始まります。私はこれを行うことができますが、変更が必要な JPanel が複数あります (9 から 729 の範囲である可能性があります)。私はこれを JFrame で問題なく行うことができます...しかし、私が現在直面している問題は、1 つの JPanel が適切に置き換えられても、次の JPanel を行うと適切に置き換えられることです。ただし、複数のテストの結果、JFrame をドラッグして画面に戻したり、その他の変更を行ったりして JFrame を更新すると、古い変更された JPanels が消えることがわかりました。

JFrameがリフレッシュされた場合にのみ消えるのではなく、新しく追加されたJPanelを永久にそこに置く方法はありますか??

コードは次のとおりです。

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

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);
于 2013-03-20T12:01:28.847 に答える
0

JFrame をドラッグして画面に戻したり、その他の変更を行ったりして JFrame を更新すると、古い変更の JPanels が消えることがわかりました。

ええと... JFrameなどのサイズを変更した後、UI repaint() メソッドが自動的に呼び出されるのは当然のようです:)

revalidate() メソッドと repaint() メソッドを検索して見つけたおかげで、JPanel を正常に削除できました。

あなたがコード戦略をgraphics2dのみに向けているのは非常に奇妙です:S毎回新しいUIをペイントする必要はありませんが、それらを保持する場合、私が得ることができるように、再初期化しないようにヒープで初期化して設定しますあなたのJPanel (?これはキャンバスとして機能しています) ...

実際には、すべての JPanel を同時に開始し、イベントごとに 1 つずつ取得する場合は、単純にある種のストレージをマップまたはリストなどとして使用し、それらすべて (非表示) を 'キャンバスのできれば 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の配列は静的オブジェクトです...複数のキャンバスオブジェクトがあることをお勧めしますか? はいの場合、静的配列は一度に 2 つの呼び出し元によるアクセスを共有できないため、当然ミニウィンは消滅します。そのため、あなたのケースでは静的フィールドを使用しないことをお勧めします...詳細については、Java 言語仕様をお読みください。


追加の質問の詳細がある場合は、コメントしてください


それが役に立ったかどうかを報告する

于 2013-03-20T19:09:52.687 に答える