【问题标题】:How do I pass actionEvents to another class?如何将 actionEvents 传递给另一个类?
【发布时间】:2016-07-03 16:03:22
【问题描述】:

基本上我在这里尝试完成的是一个 Gamebook 模拟器应用程序,到目前为止,我一直在使用 NetBeans 构建我的所有 JFrame,因为它有一种对新手友好的方法。

这是我的问题,这是我的“书”课,它讲述了故事并向玩家展示了他可能选择的前进选项。它还生成主游戏屏幕并将所有值传递给它,例如 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() 是一个 jFrame 类型的类,正在运行我在 LivroJogo 中初始化的主屏幕:

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

我在尝试捕捉玩家按下的 jButton(游戏选择)时遇到了麻烦,因为我的窗口是由 NetBeans 生成的,并且按钮方法都是私有的,我无法更改。我需要能够确定从 LivroTeste 类中按下了哪一个,因为它将根据玩家的选择控制游戏流程并刷新所有文本、历史记录和选择。 谁能指导我实现这一目标的最佳方法是什么?提前致谢。

【问题讨论】:

  • 你如何使用你班级T_Jogo中的班级LivroTeste
  • 其实是反过来的,T_Jogo是在LivroTeste内部使用的。这有点复杂,这里没有发布,但是游戏流程从带有静态 main() 的 Engine 类开始,在其中我初始化了第一个 jFrame,类似于“T_Opening”,在 T_Opening 中,当用户单击“开始”时,这个 jButton 调用另一个 jFrame,它有另一个 jButton 导致玩家选择他想玩的“书”。此时,它调用 LivroTeste(),这是迄今为止唯一可用的书(抱歉,如果不能说清楚)。
  • 所以T_Jogo 不是您的应用程序的入口点。我之所以这么认为是因为main 方法。
  • “我一直在构建我所有的 JFrames..” 请参阅 The Use of Multiple JFrames, Good/Bad Practice? “..使用 NetBeans,因为它有一个对菜鸟友好的方法。” 一个强大的 IDE 对有经验的程序员来说是一个福音,对新手来说是一个祸根,因为.. “因为我的窗口是由 NetBeans 生成的,并且按钮方法都是私有的” 新手是俗话说“尾巴摇狗”中的“狗”..

标签: java swing netbeans actionevent


【解决方案1】:

第一步:修改LivroTeste,使其实现ActionListener

第二步:修改T_Jogo如下:

(a) 在T_Jogo 中创建一个实例变量如:

  private LivroTeste livroTeste;

(b) 修改构造函数T_Jogo(Jogador jogador),多接受一个参数,使其变为:

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

第三步:在LivroTeste.iniciarHistoria()中,创建T_Jogo的实例如下:

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

第 4 步:现在,在LivroTeste.actionPerformed() 中,您将通过以下方式知道哪一个被按下:

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

希望,这会有所帮助。

【讨论】:

  • 非常感谢您花时间帮助我。进行了所有更改,但它似乎仍然无法正常工作。我没有收到任何错误,但我也不知道按下了哪个按钮,JPaneOption 根本不显示。我用所有 4 个按钮尝试了以下操作: case "jButton1": JOptionPane.showMessageDialog(null, "Botão 1"); System.out.println(str);休息;有什么想法吗??
  • 你能不能在public T_Jogo(Jogador jogador)的构造函数中再传递一个参数,让它变成public T_Jogo(Jogador jogador, LivroTeste livroTeste){ this.livroTeste = livroTeste; initComponents(); // more code follows,然后T_Jogo jogo = new T_Jogo(jogador, this);LivroTeste中创建对象。再试一次。它应该可以工作,因为您的按钮的动作监听器现在是LivroTeste。所以它的actionPerformed() 必须在按钮被点击时被调用。
  • 感谢您的快速回复,现在它正在按预期工作。我只是不知道为什么以前没有,因为 T_Jogo() 正在接收来自 setter 的 LivroTeste()。无论如何,谢谢你的帮助!
  • 嗨@Lazzo你能看看我编辑的答案吗?我已经按照对您有用的方式对其进行了修改。您是否介意点击答案左侧的复选标记 (✓) 按钮接受答案,以便读者知道如何解决类似问题?
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2014-02-24
相关资源
最近更新 更多