我在从另一个类
访问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();
}
}
答案 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>