1

CardLayout に配置された JPanels のセットがあります。問題は、1 つの JPanel で変更を加えたときに、その変更を同じデッキのカードである別の JPanel に反映させたいということです。これらの JPanel オブジェクトのそれぞれに定義された refresh() メソッドがありますが、カードのシフトに使用される構文を使用してそれらを呼び出すことができません。(ここで p は、カードのデッキのコンテナ カードです)

CardLayout cardLayout=(CardLayout)(p.getMenuCard().getLayout());
cardLayout.show(p.getMenuCard(),"Card name");

refresh() メソッドを呼び出したいのですが、CardLayout でそれを行う方法がわかりません。助けてください。

4

2 に答える 2

3

各「カード」パネルがメソッドを定義するインターフェースを実装すると仮定すると、次のrefresh()ことができます。

interface Refreshable {
    void refresh();
}

class Card1 extends JPanel implements Refreshable {...}
...

// Changing the selected card panel
cardlayout.show(deckpanel, "card name");
for (component card: deckpanel.getComponents()) {
    ((Refreshable) card).refresh();
}

これは、あなたの問題に対する私の理解によるものです。これで問題が解決しない場合は、質問を編集してさらに明確にすることを躊躇しないでください。

于 2011-05-12T12:37:57.307 に答える
1

CardLayout に配置された JPanels のセットがあります。問題は、1 つの JPanel で変更を加えたときに、その変更を同じデッキのカードである別の JPanel に反映させたいということです。これらの JPanel オブジェクトのそれぞれに定義された refresh() メソッドがありますが、カードのシフトに使用される構文を使用してそれらを呼び出すことができません。(ここで p は、カードのデッキのコンテナ カードです)

1 つのこと (CardLayout と JPanels のスワッピング) は、もう 1 つのこと (あるクラスが別のクラスの状態に基づいて状態を変更する) とは何の関係もありません。必要なのは、最初の変更を行うクラスが、この情報を変更に応答するはずの他のクラスに「プッシュ」することです。多くの場合、2 番目のクラスからセッター メソッドを呼び出します。もう 1 つのオプションは、リスナー (おそらく PropertyChangeListener) を使用して、2 番目のクラスが最初のクラスから情報を「プル」するようにすることです。しかし、繰り返しになりますが、これらの解決策はどれも、またはどのような解決策も、CardLayout やビューの交換とは何の関係もありません。

現在の状況に対するより具体的なアドバイスについては、外部の依存関係 (イメージ、データベースなど) がなく、問題を示す小さなコンパイル可能で実行可能なアプリを作成することを検討してください。 SSCCE、およびここに投稿します。

于 2011-05-12T12:42:10.640 に答える