2012-04-07 10 views
0

Javaでトランプゲームを作成しています。すべてのルールなどを含むゲームロジック全体を既にプログラムしたことから始めて、私はそのモデルの上にGUIを実装し始めました。私のJavaとSwingの知識は基本的には私にとっては裸であるからです。Java Swing:Running GUI別のClassメソッドからのメソッドの更新

私は5つのクラスを持っていますが、私が話しているのは「メイン」クラスまたはゲームクラスと「GUI」クラスだけです。まず、手を構築するために、私が作成したオブジェクトタイプ<カードのArrayListsを使用します。このゲームは、Play()と(現時点では)コンソールを介してHuman Players Handを表示し、ArrayList内の整数選択をして配置するように求める方法で再生します。私はmain(String [] args)クラスをMainクラスに持ち、クラスGUIを呼び出して私が使用するゲームボードをセットアップします。

 public static void main(String[] args) 
    { 
     Deck deck = new Deck();  
     ai = new AI; 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       GUI gui = new GUI(); 
       gui.setVisible(true); 
      } 
     }) 

は、理想的には私はゲームが両方のボードを更新し、カードの人間のプレイヤーの選択を返すためにGUIクラスからプレイ()メソッドと呼び出し方法を使用してプレイしたいと思います。ボードを設定するときに、現時点で私ができる最善のは、私がクリックされたときにパネルをクリアし、バックカードのJLabelを再描画され、

public void UpdateHand() 
    { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       inPlay = main.inPlay; 
       UpdateInPlay(inPlay, InPlayDisplay); 
       HumanHand = main.humanplayer; 
       HumanHandDisplay.removeAll(); 

を実行します

Button go = new Button("Update Hand"); 
    ButtonDisplay.add(go); 

    go.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
       Thread queryThread = new Thread() { 
      public void run() { 
       UpdateHand(); 
      } 
      }; 
       queryThread.start();      
         } 
     }); 

経由ボタンを実装していますに。

私の質問は、GUIクラスでPlay()メソッドのメソッドを呼び出すにはどうすればいいですか? Play()メソッドからUpdateHand()を実行しようとすると、ちょうど

gui.UpdateHand();

Gui.UpdateHand()行でNullPointerExceptionを返しますが、ArrayListなどのように伝えると、UpdateHand()メソッド内の変数はコンソールに出力されます。私が言ったように、ボードを更新するgui上のボタンを持つ代わりに、私は自分のPlay()メソッドを呼び出して、その順番の回りをループするようにUpdateMethodを呼び出すだけで、プレーヤーがカードを選択する必要があるとき私が今使っているコンソールスキャナを使うには、テキストフィールドとボタンをボードに追加してユーザが選択したものをタイプするメソッドを実行します。このメソッドは次にPlay()メソッドに戻され、ゲームの計算を続けます。

私が間違っていることや、ここで指定したものを達成する方法について、誰でも光を当てることができますか?

EDIT:

GUI 
public class GUI extends JFrame 
{ 
public Main main; 
private ArrayList<Card> AIHand; 
    public GUI() { 

    pane = this.getContentPane(); 
    pane.setLayout(new GridLayout(6,1,2,2)); 
    AIBackDisplay = new JPanel(); 
    //just more of the same for other panels here 

    pane.setBackground(Color.GREEN); 
    setTitle("Last Man Standing"); 
    pane.add(AIBackDisplay); 
    pane.add(AIHandDisplay); 
    pane.add(InPlayDisplay); 
    pane.add(HumanHandDisplay); 
    pane.add(HumanBackDisplay); 
    pane.add(HumanFacedownDisplay); 
    pane.add(ButtonDisplay); 

     setSize(800, 700); 
     setLocationRelativeTo(pane); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 


     UpdateFacedown(AIFacedown, AIBackDisplay); //these are methods called for original display 
     UpdateFacedown(HumanFacedown, HumanBackDisplay); 

を要求したとして、2クラスのための私のコードの

より、私はボタンを経由してと呼ばれ、この

    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)); 
        HumanHandDisplay.add(picLabel); 

       } 

       HumanHandDisplay.updateUI(); 

をしているupdateHand()メソッドを持っています私のメインクラスは

public class Main { 

    static AI ai; 
    public static GUI gui; 
です

たGUIは、そうでない場合、私はそれが私は、GUIを実行してみましょうdoes notのGUIが静的である場合でも、

 Scanner sc = new Scanner (System.in); 
       choice = sc.nextInt(); //what i'm using now 
       //choice = gui.GUIReturn(); //what i'd like to use 

を使用してそれを呼び出すことができませんでした、静的でなければなりませんでした。GUIReturn()何らかの理由で、それは静的でなければならないと言います

+1

[sscce](http://sscce.org/)を構築すると便利なことがあります。 – trashgod

+0

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

答えて

2

私はこれに答えるためにもっとコードが必要かもしれないと思います。私には、GUI GUI変数の範囲のような単純なものかもしれないようです。表示された例では、guiのスコープは、作成したRunnableオブジェクトのrunメソッド内にのみあります。

従来、GUIで何かを呼び出す適切な方法は、Singleton patternを使用することです。基本的に、それはあなたのUpdateHand()メソッドでは唯一のコードがある場合は、わずかな接線の上に、また

GUI.getInstance().myMethod(); 

を呼び出してみましょうという、あなたの余分なスレッドは、時間の無駄であるだけで

SwingUtilities.invokeLater(new Runnable(){ ... }); 

理由Runnableをイベントキューに入れ、イベントキューの実行を待ちます。それがあなたの方法の唯一のものだったならば、糸はほとんど瞬時に遠ざかります。あなたがブラケットを終了していないので、そこに唯一のコードではないかもしれませんが、ちょうど私がそれに気づくと思った。

最後に、GUIに影響するANYTHING(except some things...)は、invokeLaterで実行する必要があります。さもなければ、あなたのコードに含まれていないように見えるので、あなたは夢中になるでしょう。

+0

いいえ投稿が更新されました。私は SwingUtilities.invokeLaterをを入れた場合(新しいRunnableを(){ \t \t \t \t \t \tます。public void実行(){ \t \t \t \t \t選択肢= gui.GUIReturn(); \t \t \t \t \t \t}} ); intは最終的なものでなければならないというエラーが表示されますが、int choiceを使用する他の場所は使用できません。 – Sean

+0

は現在Singletonを実装しており、うまく動作します。ご協力ありがとうございました – Sean

関連する問題