如何删除内部类ActionListener?

时间:2012-02-04 01:18:22

标签: java actionlistener

我正在制作基于文本的游戏,但我遇到了一个相当大的问题。这个问题是,当我将一个新的ActionListener分配给已经分配了ActionListener的按钮时,它会执行这两个操作。这是我的代码:

       while(shouldLoop) {
       if(Player.loc == 1) {
       left.setText("Do nothing");
       left.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
           nar1.setText("You are still in a dungeon."); //Here's my first assignment
       }
       });
       right.setText("Pick the lock");
       right.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
               Player.loc = 2;
           }
       });
       } if(Player.loc == 2) {
               nar1.setText("You are now outside");
               nar2.setText("the door. What now?");
               forward.addActionListener(new ActionListener() {
                   @Override
                   public void actionPerformed(ActionEvent e) {
                       nar1.setText("You hear a guard.");
                       nar2.setText("What do you do now?");
                       Player.loc = 3;
       }
               });
               left.addActionListener(new ActionListener() {   //Here's another
                   @Override                                   //assignment to
                   public void actionPerformed(ActionEvent e) {//the same button
                       nar1.setText("You hear a guard.");      //so when I press
                       nar2.setText("What do you do now?");    //it here, it
                       Player.loc = 3;                         //performs the
                   }                                           //original assignment
               });
               right.addActionListener(new ActionListener() {
                   @Override
                   public void actionPerformed(ActionEvent e) {
                       nar1.setText("You hear a guard.");
                       nar2.setText("What do you do now?");
                       Player.loc = 3;
                   }
               });
               right.setText(rgt);
               forward.setText(fwd);
               back.setText(bck);
               left.setText(lft);
               forward.setVisible(true);
       } if(Player.loc == 3) {
           forward.setVisible(false);
           right.setText("Sneak around him!");
           left.setText("Fight him!");
       }

感谢您的帮助,

billofbong

3 个答案:

答案 0 :(得分:0)

为什么不将addActionListener代码从while循环中提升出来?

答案 1 :(得分:0)

匿名内部类侦听器在快速和脏的示例代码中看起来不错,但实际上,它们是一个可怕的想法。你正在学习其中一个原因。其他原因是它们不能通过依赖注入类型的东西容易地进行子类化或修改,不能轻易共享(比如按钮,工具栏图标和菜单做同样的事情),不能轻易启用/禁用,(例如,“另存为”应该被禁用,因为什么都没有打开)等......

对于这个用例,将它们分解为一系列实际的Listener,可能是在类,数组或一些枚举中组织的,因此它们可以交换进来。

答案 2 :(得分:0)

您通过在程序本身中对程序的逻辑进行硬编码,将数据与代码混合在一起,这是您当前和未来问题的主要来源。这是行不通的,至少在没有很多问题的情况下也是如此。

我建议你尝试将你的数据从你的代码中分离出来,让你的程序更像MVC-ish,它是Model-View-Controller(或其众多变种之一)。例如,程序的逻辑由模型保存,其中包括正在探索的土地的非可视化地图,玩家在此地图中的位置,他的同伴以及您收集的物品清单。因此,您可能会有几个非GUI类,例如Player,Map,Item(这可能是一个界面),Room等...... Map本身,可能的项目,位置,将在数据文件中指定,也许是一个简单程序的文本文件或一个更复杂的程序的数据库,你需要类来读取和解析这个文件。

你的程序视图是你的GUI,它应该尽可能愚蠢。在这里,您可以获得按钮,文本显示以及幻想,游戏的图形显示。没有程序逻辑在这里。无。

Control将是您添加到JButtons的Action Listeners以及必须处理用户输入的任何其他代码。但是这段代码可能相对简单,它的主要任务是将用户交互传递给模型。因此,例如,如果按下左键,则可能只是

model.leftButtonPress();

然后模型将决定如何处理左按钮,如果有的话。例如,模型将知道你在游戏中的位置,如果左边有一扇门,或者它是墙,并且基于模型的状态,你的游戏将执行必要的操作。 / p>