在重写方法java

时间:2016-03-10 21:45:18

标签: java actionlistener method-overriding

我在从另一个类

访问main中声明的对象时遇到了一些麻烦
public static void main(String[]args)
{ 
  Knight knight=new Knight();
  Room2 room2=new Room2()
}

问题是我无法将此对象作为参数传递给此特定方法,因为它是一个actionListener重写方法,所以像这样Accessing objects of other classes 不会工作

public void actionPerformed(ActionEvent e)
{

    if(e.getSource()==attack)
    {
        knight.getHealth();
    }
}

在ActionEvent e参数之后,我无法传递任何额外的东西 所以我想问一下,这可能是骑士对象在本课程中得到认可,还是我必须做一些完全不同的事情 感谢

编辑 主要方法是简单地创建像knight这样的角色对象,这是一个具体的类

 class attack

public class Room2扩展JFrame实现ActionListener {

private JButton attack;
private JButton defend;
//private JLabel item1read;

 CardLayout cl=new CardLayout();
GridBagConstraints gb=new GridBagConstraints();
JPanel panel =new JPanel();

public Room2()
{


       //******************************
    battlePanel.setLayout(new GridBagLayout());

    attack=new JButton("Attack");
    gb.gridx=1;
    gb.gridy=1;
    gb.insets=new Insets(10,10,10,10);
    attack.addActionListener(this);
    battlePanel.add(attack,gb);


    defend=new JButton("defend");
    gb.gridx=1;
    gb.gridy=2;
    battlePanel.add(defend,gb);



   public void actionPerformed(ActionEvent e)
{

    if(e.getSource()==attack)
    {
         knight.getHealth();

    }
}

2 个答案:

答案 0 :(得分:2)

这一行...

id

...只在主方法中有范围。

您将不得不实例化应用程序的具体对象,并通过actionPerformed处理程序中的getKnight()方法访问Knight。

Knight knight=new Knight();

或者您必须将Knight对象定义为主应用程序类的静态变量,并从actionPerformed处理程序中静态访问它,例如。

public class TestClass {
    Knight knight;

    public static void main(String[] args) {
        TestClass testClass = new TestClass();
        testClass.run();
    }

    public Knight getKnight() {
        return this.knight;
    }

    public void run() {
        this.knight = new Knight();

        // Do other stuff, add event handler, etc. Then you can access via getKnight() method.
    }
}

这是不太可取的,因为它使骑士对其他类更加可见,并且可以在包含它的主类之外轻易改变。

答案 1 :(得分:2)

根据您的代码,您可能希望将Knight实例传递到Room实例,可能是通过其构造函数传递:

private Knight knight;

public Room2(final Knight knight) {

    this.knight = knight;

    battlePanel.setLayout(new GridBagLayout());
    attack=new JButton("Attack");
    gb.gridx=1;
    gb.gridy=1;
    gb.insets=new Insets(10,10,10,10);
    attack.addActionListener(this);
    battlePanel.add(attack,gb);
    defend=new JButton("defend");
    gb.gridx=1;
    gb.gridy=2;
    battlePanel.add(defend,gb);

    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==attack){
            knight.getHealth();
        }
    }
}

创建时,将其传递给:

Room room = new Room(knight);

如,

public static void main(String[]args) { 
  Knight knight=new Knight();
  Room2 room2=new Room2(knight);
}

更好的是,如果Room2代表一个实体房间,而骑士是一个真正的骑士,那么我会将我的模型建立在现实基础上 - 骑士并不总是在房间内,所以我的代码基础在这个现实。也许给Room2一个enter(...)exit(...)方法对,允许GameManager类调用这些方法。房间也可以有public List<Participants> listParticipants()或类似的类型方法,列出所有骑士,怪物或那个房间里碰巧的东西。然后房间的行为可能取决于其居住者。

同样,您可以为所有参与者提供位置字段以及使用getter方法的setLocation(...)方法,以便所有参与者行为(包括骑士的行为)都可以根据其位置进行更改。 / p>