当某个变量为零时禁用按钮? [已解决:观察者设计模式]

时间:2013-10-12 13:49:45

标签: java swing jbutton observer-pattern

我正在制作一款简单的格斗游戏。有两个对立的球员,他们的目标是消灭另一个;我创造了健康酒吧等。为了对对手发动攻击,用户点击某个按钮“攻击”。如果一个玩家的健康栏已达到零,我希望禁用此按钮。

frame http://sstatic.net/stackoverflow/img/Untitled.jpg

我的程序结构:

主类(公共类App扩展JFrame)  //私人JButtons,JPanels等

公共应用()    //所有组件和已注册侦听器的布局

主要方法   // frame / s(我的主方法中有多个框架。哈哈)

监听器类/ es  // if else语句(if(e.getSource == xyz))

绘制健康栏的JPanel类/ es

----结构结束

这是我到目前为止在面板类上所做的事情(总源代码是一个800行的txt文件):

    class HP2panel extends JPanel {

    public void damageTake() {
    if (widthHP <= 0) {   
    damageToMe = 0;
    }
    else if (widthRage >= 250) {  
    damageToMe = 175 + (int)(Math.random() * 25);
    }
    else if (widthHP > 0 && widthRage < 250) { 
    damageToMe = Math.round(1 + (int)(Math.random() * 15));
    }
    if (widthHP2 <= 0) {
    damageToMe = 0;
    }
    widthHP2 = widthHP2 - damageToMe;

    logtxt.append("\nYour HP: " + widthHP2);
    logtxt.append("\nDamage you've taken: " + damageToMe);
    repaint();
}

public void healdamageTake() {
    if (widthHP2 <= 0) {
    Heal = 0;
    }
    if (widthHP2 >= 250) {
    Heal = 0;
    }
    else {
    Heal = (int)(Math.random() * 25);
    }
    widthHP2 = widthHP2 + Heal;
    logtxt.append("\n");
    logtxt.append("\nHealed HP: " + Heal);
    repaint();
}

public void restartHP2() {
    widthHP2 = 250;
    repaint();
}

    @Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.green);
    g.fillRect(0, 0, widthHP2, 16);
}


    }

HP2panel是面板类,其中绘制了播放器2的运行状况栏(fillRect)。 widthHP,widthRage是我制作的其他小组类的参数。

我想在widthHP为零或小于时禁用攻击按钮。 我曾经在if语句上工作,但似乎没用。

我不知道我是否会将它放在我的Listener类或我的代码中的任何其他位置。

1 个答案:

答案 0 :(得分:4)

我认为关键是使用 Observer Design Pattern 来允许一个对象侦听另一个对象中的状态更改。

我假设每个Player类都有一个健康字段。我通过给予Player类一个私有的SwingPropertyChangeSupport字段,通过给出Player类addPropertyChangeListenerremovePropertyChangeListener方法,并通过调用{{1}通知您的听众健康变化,使其成为“绑定”属性每当在firePropertyChange(...)方法内更改健康属性时,方法。这样,任何需要监听健康变化(或Player类的任何其他绑定属性)的类都可以这样做,并且可以根据需要响应这些更改。这是类字段/属性应该是私有的并且只能通过setter方法更改的另一个原因。

例如:

驱动程序类,PropChangeEg.java

setHealth(...)

Player.java类

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.event.*;

public class PropChangeEg {
   private static void createAndShowGui() {
      JFrame frame = new JFrame("Prop Change Example");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new PlayerPanel(new Player("Pete")));
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

PlayerPanel.java类

class Player {
   public static final String HEALTH = "health";
   private SwingPropertyChangeSupport propChangeSupport = 
             new SwingPropertyChangeSupport(this);
   private String name;
   private int health = 100;

   public Player(String name) {
      this.name = name;
   }

   public void addPropertyChangeListener(PropertyChangeListener listener) {
      propChangeSupport.addPropertyChangeListener(listener);
   }

   public void removePropertyChangeListener(PropertyChangeListener listener) {
      propChangeSupport.removePropertyChangeListener(listener);
   }

   public int getHealth() {
      return health;
   }

   public void setHealth(int health) {
      int oldValue = this.health;
      int newValue = health;
      this.health = health;
      propChangeSupport.firePropertyChange(HEALTH, oldValue, newValue);
   }

   public String getName() {
      return name;
   }

}

这将导致JButton响应玩家健康状况所持有的值。例如,以下是来自此GUI的两个屏幕,一个具有正的非零健康值,另一个具有Player的健康值为零:

enter image description here