2012-04-16 6 views
0

私はカードゲームを持っていて、ArrayListsを使って人々の手にカードを保存しています。私は、メインクラスでInvokeLaterを使って呼び出されたスレッドを使ってGUIクラスを更新します。選手の手からのカードの選択。私がしたいのは、プレイヤーが選択をしなければならないときに実行される、おそらく呼び出しと待機でスレッドを実行することです。次に、プレーヤーがGUI内の対応するカードをクリックし、カードの場所の適切なintを返すのを待ちます。この選択は私のゲームで処理されます。Java Swing:Intを返す前にマウスクリックイベントを待っている

どのように私のGUIを更新していますか?

 public static void Play(ArrayList<Card> ...){ 
     UpdateHand(player1, deck, deckused); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       GUI.getInstance().UpdateHand(); 

      } 
     }); 

リスナーをカードに取り付け、その名前を手の対応する場所のintに設定します。

public void PlayerSelection() 
    { 
     selection = -1; 
     Information = new JLabel("Please Select Your Card"); 
     ButtonDisplay.add(Information); 
     ButtonDisplay.updateUI(); 
     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) { 
      // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        JLabel picLabel = new JLabel(new ImageIcon(cardImage)); 
        String name = "" + i; 
        picLabel.setName(name); 
        picLabel.addMouseListener((MouseListener) this); 
        HumanHandDisplay.add(picLabel); 
      } 
    } 

マウスをクリックしたときに選択するintを格納します。

残りの計算で使用するために、このintをメインクラスのPlay()メソッドに戻したいと考えています。私は、これを行う方法、具体的には選択が行われるのを待つことができません。私はこれを行うことができると聞いてきましたが、これを自分の仕事にどのように実装するのかは分かりません。誰かがそれが偉大になるのを助けることができたら。

+0

Java命名規則を学び、それらに固執してください。 – kleopatra

答えて

2

いいえ、スレッドを一時停止したり、ここで並べ替えることは望ましくありません。代わりに、ユーザーのプログラム内のどこに応じてプログラムの状態を変更し、その応答やプログラムの動作はその状態によって異なります。

たとえば、ユーザーがカードを再生するのを待つ必要がある場合、メインクラスにcurrentPlayer変数を与え、ユーザーが自分のターンに割り当てます。次に、自分のターンに適切な有効な入力を除いて、ユーザーの入力に応答しないようにプログラムをコーディングします。

次に、メインのGameEngineクラスは、currentPlayer変数を次のプレイヤーに送り、その応答を待ちます。

編集1
あなたの状態:

私は本当に理解していません。私はすでにゲームを実装しています。ルールとAIプレイヤーはすべて対戦します。私は、マウスクリックイベントを待つためにGUI上にスキャナを使って選択範囲を広げる必要があります。

あなたはGUI イベントベースのプログラム、新しいプログラムはイベントベースであるということでキーにコンソールベースの線形プログラムから移動し、大規模な移行を作っていることを理解してください。現在のコードが、静的な変数とメソッドが最小限で、適切に動作するOOPs準拠のクラスと、明確な状態を持つクラスで記述されている場合は、移行がスムーズに進まなければなりません。一方、現在のコードベースのクラスがほとんどなく、リニアコンソールのユーザーインターフェイスを中心にしている場合は、コードを最初から書き直す必要があります。

現在のコードをいくつか表示し、そのデザインについて説明してください。

次は状態:

私はプログラムがint以外に応答しないことを確認してくださいmakeingに行くかどう?

プログラムがintにしか応答しないということを明確にしてください。 intはどこですか? JTextFieldで?どこか別の場所?これはおそらく、ある種の入力検証を必要とする可能性があります。

+0

私は本当に理解しているか分からない。私はすでにゲームを実装しています。ルールとAIプレイヤーはすべて対戦します。私は、マウスクリックイベントを待つためにGUI上にスキャナを使って選択範囲を広げる必要があります。 プログラムがint以外のものに応答しないことを確認するにはどうすればよいですか? – Sean

+0

@Sean:** 1を編集**をご覧ください。 –

0

あなたが望むのは、カスタムコンポーネントのモダリティであり、Swingでは不可能です(少なくとも独自のモダリティを実装するための多くの努力が必要ではありません)。あなたのプログラムは、@ Hovercraftの答えと同じように、状態を持ち、イベントベースでなければなりません。

関連する問題