2011-12-26 11 views
2

私は、各プレイヤーが3x3グリッドを塗りつぶし、すべてがグリッドの異なる状態を持つゲームを作成しています(プレイヤーオブジェクトはグリッドとしてインスタンス変数を持ち、グリッドは多数JPanel)。特定のGUI要素を動的に置き換えます。

私はのプレイヤーを左側に、右側にグリッドを表示しています。リスト内でプレーヤーの名前をクリックすると、グリッドを動的に変更する方法はありますか?

(私はプレイヤーが選択されるたびにグリッドを更新しようとしましたが、プレイヤーが選択された後にグリッドを更新すると、グリッドを更新するためにハッキーになります。フォーカスなど私はきれいな方法を探しています)

EDIT:また、私はオブジェクトの参照を動的に変更し、UIを更新すると思ったが、私は変数をFINALにするいくつかのアクションイベントがあります。だから私はこのやり方もできません。

答えて

3

選択が変更されたときにグリッドを変更しないでください。グリッドによって表示されるデータ(グリッドのデータモデル)を変更する必要があります。たとえば、グリッドが9つのラベルを含むパネルであり、それぞれがString[][]の1つの要素を表示しているとします。 Gridオブジェクトには、グリッド内の各ラベルの値を変更するsetModel(String[][] data)が必要です。

プレイヤーの選択が変更されるたびに、選択したプレイヤーにそのデータを依頼し、グリッド上でsetData()と電話する必要があります。プレーヤーのデータが変更されている間に変更できる場合は、変更するたびにsetData()を呼び出す必要があります。これは、データが変更されたときにPlayerによってトリガーされるPropertyChangeEventと、イベントをトリガーするプレーヤーが選択されたプレーヤーである場合に新しいデータでグリッドを更新するリスナーを持つことによって実行できます。

+0

これはおそらくforループが必要になると思いますか?その場合、他のプレイヤーのグリッドを「表示」するなど、他の方法より効率的ではありませんか? – Cemre

+2

パフォーマンスに問題が生じる前に、パフォーマンスについて気にする必要はありません。あなたは1ミリ秒で何回行うことができるか知っていますか? GUIでコンポーネントを変更するたびに実行される操作の数は分かりますか?他のコンポーネントを表示する必要がないため、私のソリューションはより効率的です。しかし、それは重要ではありません。重要なことは、十分に速いことです。 –

1

基本的に、選択したプレーヤーがどのグリッドが表示されるかを決定する選手のリストがあります。グリッドを含むパネルにCardLayoutを使用する場合は、選択が更新されたときに特定のプレーヤに対応するグリッドを表示するように尋ねることができます。

特別な必要はありません。for -loopsですが、CardLayout#showメソッドを呼び出すだけです。

全体tutorialあなたはCardLayoutと9枚のパネルを配置し、適切なカードを入れ替えることができCardLayouts

3

での作業に関する情報を提供されています。または、古いコンポーネントを削除して新しいコンポーネントを追加し、追加後にrevalidate()repaint()を呼び出してもかまいません。

1

Concurrency in Swingを達成するには、イベントディスパッチスレッドのジョブをスケジュールする必要があります。そのため、UIに何らかの変更が発生しても、ヒックアップは表示されません。

このような何か:

public static void main(String... args) 
{ 
    // Used to schedule a job for event-dispatcher thread 
    SwingUtilites.invokeLater(new RUnnable() 
    { 
    public void run() 
    { 
     // put your code for creating and displaying the GUI here. 
     // or call the method which is creating and displaying the GUI here. 
    } 
    } 
); 
} 

変更を加えるように、単に(再検証を使用)と()メソッドを再描画します。それはあなたが達成しようとしていることです。 これは助けになると思います。

ありがとうございます

関連する問題