こんにちは、私は 2 つの問題を抱えています。どちらも Java Swing に関連しています。Javaでカードゲームを開発しています。タイプの配列リストを使用して各カードの値を保持し、invokeLater を使用して GUI の更新を呼び出すメインの Play() メソッドと、GUI クラスへのシングルトン アプローチを使用します。
最初の質問はかなり単純です。このように JLabels を使用して GUI でカードを作成します。関連するリスナーをアタッチし、適切なパネル (この場合は「ヒューマン ハンド パネル」) に追加します。
for (int i = 0; i < (HumanHand.size()); i++) { Card card = HumanHand.get(i); BufferedImage cardImage = null; try { cardImage = ImageIO.read(new File("card/" + card + ".jpg")); } catch (IOException e) { e.printStackTrace(); } JLabel picLabel = new JLabel(new ImageIcon( cardImage )); picLabel.addMouseListener((MouseListener) me); HumanHandDisplay.add(picLabel); } //HumanHandDisplay.validate(); HumanHandDisplay.updateUI();
私が抱えている問題は、人間の手札が 7 枚以上の場合、より大きなパネル領域が作成され、その下に新しいカードの列が開始されることです。私がやりたいのは、手札が特定のサイズに達すると、カードが互いに重なり始めることです (手札にカードを保持するように)。私は .validate() をいじりましたが、どこにも行きませんでした。ここで提供できるヘルプは大歓迎です。
2 番目の質問は、Swing Worker を使用して人間プレイヤーのカード選択を返すことについてです。Swing ワーカーについて少し読んだことがありますが、自分のゲームに Swing ワーカーを実装する最善の方法がわかりません。現在、コンソールを使用して、int の入力を選択肢 (ArrayList 内の特定のカードの場所) として受け取るスキャナーがあります。プレイヤーの手札のカードをクリックして、この int を選択したいと思います。現時点で私は使用しています:
String name = "" + i; picLabel.setName(name);
Card JLabels の名前を for ループで int に設定して (示されているように^^)、次を使用します。
public void mouseClicked(MouseEvent e) { String name = ((JLabel)e.getSource()).getName(); System.out.println("Working " + name); selection = Integer.parseInt(name); }
カードの 1 つがクリックされたときにその int を返す。Play() からも GUI メソッドを呼び出すために使用しているものは次のとおりです。
SwingUtilities.invokeLater(new Runnable() { public void run() { GUI.getInstance().UpdateHand(); } });
私の質問は、適切なリスナーでハンドをセットアップする GUI クラスのメソッドを呼び出すように Play メソッドを取得するにはどうすればよいか (ここでは GUIPlayerSelection() と呼びましょう)、プレイヤーがカードをクリックするのを待ちます。次に、選択したカードを表すメイン クラスの Play() メソッドに int を返します。インボークとウェイトを使用する方法がわかりません。インボークとウェイトを使用する場合、カードがセットアップされるのを待つだけですか、それとも mouseClicked() メソッドが終了するのを待つのでしょうか? または、手のセットアップ後にマウスがクリックされるのを確実に待つために何か他のことをする必要がありますか? そして、どうすればそのintを返すことができますか? 私はスイングワーカーを使用するように言われましたが、誰かがこの場合にそれを実装する方法を説明できれば、それは素晴らしいことです.
前もって感謝します。