2

各プレーヤーが 3x3 グリッドを埋めるゲームを作成しており、それらはすべてグリッドの状態が異なります (プレーヤー オブジェクトにはグリッドとしてインスタンス変数があり、グリッドは多くJPanelの で構成されています)。

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

forプレーヤーが選択されるたびにグリッドを更新するループを実行しようとしましたが、プレーヤーが選択された後にグリッドを更新すると、グリッドを更新するのが面倒になります。つまり、リストにフォーカスを取得させる必要があります。きれいな方法を探しています)

編集:また、オブジェクトの参照を動的に変更してUIを更新することも考えましたが、変数をFINALにするよう強制するアクションイベントがいくつかあります。だから私もこのようにすることはできません。

4

4 に答える 4

3

9つのパネルを配置してCardLayout、適切なカードを交換できます。または、古いコンポーネントを削除して新しいコンポーネントを追加することもできます。代わりに、追加後にrevalidate()andを呼び出しrepaint()ます。

于 2011-12-26T10:54:52.960 に答える
3

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

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

于 2011-12-26T10:56:53.363 に答える
1

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.
     }
   }
  );
}

したがって、変更を加えるときは、 revalidate() および repaint() メソッドを使用するだけです。それは、あなたが達成しようとしていることです。それが助けになることを願っています。

よろしく

于 2011-12-26T13:32:38.157 に答える
1

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

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

CardLayouts の操作に関する情報を含むチュートリアル全体を利用できます。

于 2011-12-26T10:54:09.703 に答える