2016-07-03 11 views
0

Im Grunde versuche ich hier eine Gamebook-Simulator-Anwendung, bis jetzt habe ich alle meine JFrames mit NetBeans erstellt, da es einen noob-freundlichen Ansatz hat.Wie übergebe ich actionEvents an eine andere Klasse?

Hier ist mein Problem, das ist meine "Buch" -Klasse, die die Geschichte erzählt und präsentiert dem Spieler mit den möglichen Optionen, die er wählen kann, um fortzufahren. Es erzeugt auch den Hauptspielbildschirm und übergibt ihm alle Werte, wie jText (Geschichte) und jLabels (wie Spielername, Leben ...).

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() ist eine JFrame Typklasse, mein Hauptbildschirm ist jogo innen LivroJogo initialisiert:

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

Ich bin vor Probleme, welche JButton (das Spiel Auswahl), um die Spieler drückt zu erfassen versucht, da meine Fenster von NetBeans erzeugt wurden und die buttons Methoden alle privat sind, was ich nicht ändern kann. Ich muss in der Lage sein, aus der LivroTeste-Klasse zu bestimmen, welche man gedrückt wurde, da es den Spielfluss steuert und den gesamten Text, den Verlauf und die Auswahl aktualisiert, je nachdem, was der Spieler gewählt hat. Könnte mir bitte jemand sagen, was der beste Weg wäre, dies zu erreichen? Danke im Voraus.

+0

Wie verwenden Sie die Klasse 'LivroTeste' aus Ihrer Klasse' T_Jogo'? –

+0

Es ist eigentlich umgekehrt, T_Jogo wird in LivroTeste verwendet. Es ist ein bisschen kompliziert und nicht hier gepostet, aber der Spielablauf beginnt in einer Engine-Klasse mit einem statischen main(), innerhalb dessen initialisierte ich den ersten jFrame, etwa "T_Opening", innerhalb von T_Opening, wenn der Benutzer auf "Start" klickte, Dieser jButton fordert einen anderen jFrame, der einen anderen jButton hat, der dazu führt, dass der Spieler auswählt, welches "Buch" er spielen möchte. An dieser Stelle wird LivroTeste() aufgerufen, das bisher einzige verfügbare Buch (sorry, wenn es nicht klar ist). – Lazzo

+0

Also 'T_Jogo' ist nicht der Einstiegspunkt Ihrer Anwendung. Ich dachte es wegen der "Haupt" -Methode. –

Antwort

0

Schritt 1: Ändern LivroTeste so dass es Action implementiert

Schritt 2: Ändern T_Jogo wie folgt:

(a) Erstellen einer Instanzvariable in T_Jogo wie:

private LivroTeste livroTeste; 

(b) Ändern Sie den Konstruktor T_Jogo(Jogador jogador), um einen weiteren Parameter zu akzeptieren, so dass er lautet:

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

Schritt 3: In , die Instanz von T_Jogo wie folgt erstellen:

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

Schritt 4: Nun, in LivroTeste.actionPerformed() Sie werden wissen, was man in folgenden Weise gedrückt wurde:

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

Hoffe, das hilft.

+0

Vielen Dank für Ihre Zeit verbringen versuchen, mir zu helfen.Hat alle Änderungen vorgenommen, trotzdem scheint es nicht richtig zu funktionieren. Ich bekomme keine Fehler, aber weder ich weiß, welche Taste gedrückt wird, JPaneOption zeigt einfach überhaupt nicht. Ich habe folgendes mit allen 4 Tasten versucht: Fall "jButton1": JOptionPane.showMessageDialog (null, "Botão 1"); System.out.println (str); Pause; Irgendwelche Gedanken ?? – Lazzo

+0

Können Sie einen weiteren Parameter im Konstruktor von 'public T_Jogo (Jogador jogador)' übergeben, so dass es 'öffentlich wird T_Jogo (Jogador jogador, LivroTeste livroTeste) {this.livroTeste = livroTeste; initComponents(); // mehr Code follows' und erstellen Sie ein Objekt in 'LivroTeste' von' T_Jogo jogo = new T_Jogo (jogador, this); '. Versuche noch einmal. Es sollte funktionieren, da der Aktionslistener für Ihre Buttons jetzt 'LivroTeste' ist. Also muss seine'AktionPerformed() 'aufgerufen werden, wenn auf Schaltflächen geklickt wird. –

+0

Vielen Dank für die schnelle Antwort, jetzt funktioniert es genau wie beabsichtigt.Ich weiß nur nicht warum es vorher nicht war, da T_Jogo() LivroTeste() vom Setter erhalten hat. Wie auch immer, danke für deine Hilfe! – Lazzo

Verwandte Themen