2016-07-03 18 views
0

基本的に私がここで達成しようとしているのは、Gamebookシミュレータアプリケーションです。これまでのところ、NetBeansを使用してすべてのJFramesを構築しています。actionEventを別のクラスに渡すにはどうすればよいですか?

これは私の問題です。これは私の "本"クラスであり、物語を伝え、彼が進めることのできるオプションをプレイヤーに提示します。また、メインのゲーム画面を生成し、jText(履歴)やjLabels(プレーヤー名、人生など)などのすべての値を渡します。

package estrutura; 

public class LivroTeste extends Livro { 

     public LivroTeste(Jogador jogador) { 
      super(null, null); 
     } 

    public void iniciarHistoria(Jogador jogador) { 

       T_Jogo jogo = new T_Jogo(jogador); 
       jogo.setVisible(true); 

       System.out.println("NOME DO PUTO: " + jogador.getNome()); 

     Encontro i = new Encontro("Você está no fluxo e avista o José no grau, " 
       + "você sabe o que ele quer?"); 
       jogo.printEncontro(i.getDescricao()); 

     i.addEscolhas("Ele quer pau, pau, pau, pau, ele quer pau..."); 
     i.addEscolhas("O Zé quer upar!"); 
       i.addEscolhas("Ele quer Shirlar!"); 
       i.addEscolhas("Nenhuma das anteriores."); 

       jogo.add0(i.getEscolhas().get(0)); 
       jogo.add1(i.getEscolhas().get(1)); 
       jogo.add2(i.getEscolhas().get(2)); 
       jogo.add3(i.getEscolhas().get(3)); 

       System.out.println("CHEGOU AQUI!"); 

    } 

    public void floresta1(Jogador jogador) { 
     Encontro f1 = new Encontro(jogador.getNome() + " segue pela floresta..."); 
    } 

    public void rio1(Jogador jogador) { 
     Encontro r1 = new Encontro("Você avista o rio e começa a caminhar pela margem..."); 
    } 
} 

T_Jogoは()であることジョーゴがLivroJogoの内側に私のメイン画面を初期化し、JFrameの型クラスである:私はこれのJButton(ゲームの選択)プレイヤー機を捕獲しようとしている問題に直面しています

package estrutura; 

import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JOptionPane; 

public class T_Jogo extends javax.swing.JFrame implements ActionListener { 

    /** 
    * Creates new form T_Jogo 
    */ 
    public T_Jogo() { 
     initComponents(); 

     this.setResizable(false); 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2); 
    } 

    public T_Jogo(Jogador jogador) { 
     initComponents(); 

     //Centraliza janela e desabilita botão maximizar 
     this.setResizable(false); 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2); 

     jTextArea1.setEditable(false); 
     jTextArea1.setLineWrap(true); 

     jButton1.addActionListener(this); 
     jButton2.addActionListener(this); 
     jButton3.addActionListener(this); 
     jButton4.addActionListener(this); 

     jLabel1.setText(jogador.getNome()); 
     jLabel5.setText(Integer.toString(jogador.getVida())); 
     jLabel6.setText(Integer.toString(jogador.getAtaque())); 
     jLabel7.setText(Integer.toString(jogador.getPericia())); 
    } 
    . 
    . 
    . 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == jButton1) 
      JOptionPane.showMessageDialog(this, "Botão 1"); 

     else if(e.getSource() == jButton2) 
      JOptionPane.showMessageDialog(this, "Botão 2"); 

     else if(e.getSource() == jButton3) 
      JOptionPane.showMessageDialog(this, "Botão 3"); 

     else if(e.getSource() == jButton4) 
      JOptionPane.showMessageDialog(this, "Botão 4"); 
    } 
    public void printEncontro(String texto) { 
     jTextArea1.setText(texto); 
    } 
    public void add0(String texto) { 
     opcao1.setText(texto); 
    } 
    public void add1(String texto) { 
     opcao2.setText(texto); 
    } 
    public void add2(String texto) { 
     opcao3.setText(texto); 
    } 
    public void add3(String texto) { 
     opcao4.setText(texto); 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(T_Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(T_Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(T_Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(T_Jogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new T_Jogo().setVisible(true); 
      } 
     }); 
    } 

、私のウィンドウはNetBeansによって生成されており、ボタンのメソッドはすべてプライベートなので変更できません。私は、LivroTesteクラスの中から押されたことを判断できるようにする必要があります。プレーヤーが選んだものに基づいて、ゲームフローを制御し、すべてのテキスト、履歴、選択肢をリフレッシュするからです。 これを達成する最良の方法は誰でも私を導いてくれますか?前もって感謝します。

+0

クラス 'T_Jogo'から' LivroTeste'クラスをどうやって使用しますか? –

+0

実際には逆の方法ですが、T_JogoはLivroTesteの内部で使用されます。これはちょっと複雑で、ここには投稿されていませんが、ゲームの流れは静的なmain()を持つEngineクラスから始まり、 "Start"をクリックするとT_Openingの中で "T_Opening"のような最初のjFrameを初期化します。このjButtonはもう1つのjFrameを呼び出します。これには別のjButtonがあり、プレイヤーは彼が再生したい "ブック"を選択します。 この時点で、LivroTeste()が呼び出されています。これはこれまでのところ唯一の本です(申し訳ありませんが、明らかにできませんでした)。 – Lazzo

+0

したがって、 'T_Jogo'はアプリケーションのエントリポイントではありません。私は 'main'メソッドのためにそう思った。 –

答えて

0

ステップ1:それはActionListenerを実装するようにLivroTesteを変更

ステップ2:次のようにT_Jogoを変更:

(A)のようなT_Jogoにインスタンス変数を作成します。

private LivroTeste livroTeste; 

(B )コンストラクタT_Jogo(Jogador jogador)を変更して、もう1つのパラメータを受け入れるようにします。

public T_Jogo(Jogador jogador, LivroTeste livroTeste) { 
    this.livroTeste = livroTeste; 
    initComponents(); 

    //Centraliza janela e desabilita botão maximizar 
    this.setResizable(false); 
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2); 

    jTextArea1.setEditable(false); 
    jTextArea1.setLineWrap(true); 

    jButton1.setActionCommand("jButton1"); 
    jButton1.addActionListener(livroTeste); 

    jButton2.setActionCommand("jButton2"); 
    jButton2.addActionListener(livroTeste); 

    jButton3.setActionCommand("jButton3"); 
    jButton3.addActionListener(livroTeste); 

    jButton4.setActionCommand("jButton4"); 
    jButton4.addActionListener(livroTeste); 

    jLabel1.setText(jogador.getNome()); 
    jLabel5.setText(Integer.toString(jogador.getVida())); 
    jLabel6.setText(Integer.toString(jogador.getAtaque())); 
    jLabel7.setText(Integer.toString(jogador.getPericia())); 
} 

ステップ3:次のようにでは、T_Jogoのインスタンスを作成します。

T_Jogo jogo = new T_Jogo(jogador, this); 
jogo.setVisible(true); 

ステップ4:今、LivroTeste.actionPerformed()にあなたは、次のように押された1知っている:

public void actionPerformed(ActionEvent e) { 
    String str = e.getActionCommand(); 
    if(str.equals("jButton1")){ 
     JOptionPane.showMessageDialog(null, "Botão 1"); 
    } 
    } 

希望、これは役立ちます。

+0

私を助けようと時間を費やしてくれてありがとう。すべての変更を行いましたが、それでも正しく動作していないようです。エラーは発生しませんが、どちらのボタンが押されているかわかりませんが、JPaneOptionは全く表示されません。私はすべての4つのボタンで以下を試しました: case "jButton1": JOptionPane.showMessageDialog(null、 "Botao 1"); System.out.println(文字列); 休憩。 – Lazzo

+0

'public T_Jogo(Jogador jogador)'のコンストラクタでもう1つのパラメータを 'public T_Jogo(Jogador jogador、LivroTeste livroTeste){this.livroTeste = livroTeste;}にすることができます。 initComponents(); // more codes follows'を実行し、 'T_Jogo jogo = new T_Jogo(jogador、this);で' LivroTeste'にオブジェクトを作成します。もう一度試してみてください。これは、あなたのボタンのアクションリスナーが 'LivroTeste'になったので機能します。したがって、 'actionPerformed()'は、ボタンがクリックされたときに呼び出されなければなりません。 –

+0

T_Jogo()がセッターによってLivroTeste()を受信して​​いたので、なぜそれが以前にはなかったのか分かりません。とにかく、あなたの助けをありがとう! – Lazzo

関連する問題