【问题标题】:Best way to modify objects declared in other classes (Java)修改在其他类中声明的对象的最佳方法(Java)
【发布时间】:2015-02-06 15:18:06
【问题描述】:

我正在为班级制作井字游戏,玩家必须是对象。我正在为 GUI 使用 windowbuilder,在这方面,我们必须修改播放器的名称(播放器对象的一部分)。在另一个与播放器和菜单类分开的类中,我们必须访问播放器的对象以使用 getter 获取名称,以将其显示在屏幕上。我需要知道如何修改另一个类的对象。

播放器类中的构造函数:

    public Player(String player, int initialGamesWon) {
    playerName = player;
    gamesWon = initialGamesWon;
}

当我们按下开始时菜单会发生什么:

            public void actionPerformed(ActionEvent arg0) {
            GameBoard game = new GameBoard();
            game.main(null);
            String newPlayerName = playersName.getText();
            Player player1 = new Player(newPlayerName);

        }

这里的菜单代码中,我们没有使用默认的构造函数,但类似,只是将初始游戏设置为0。 在游戏板代码中,我们想要成为玩家名字的标签:

        JLabel lblNewLabel_1 = new JLabel(player1.getPlayerName());

这是我们得到错误的地方,因为 player1 对象未在此类中声明。

编辑:我们已经到了可以在菜单中创建一个新播放器并更改其名称的地步,如下所示:

            public void actionPerformed(ActionEvent arg0) {
            GameBoard game = new GameBoard();
            game.main(null);
            String newPlayerName = playersName.getText();
            setPlayerName(newPlayerName);

        }

这里是菜单类中其他适用的方法

    public void setPlayerName(String newName) {
    player1.changeName(playersName.getText());
}
public String getMenuName() {
    return player1.getPlayerName();
}

这是我在游戏板上的代码,但仍然无法正常工作:

        JLabel lblNewLabel_1 = new JLabel(getMenuName());

但是,这里没有声明 getMenuName。

【问题讨论】:

  • 为什么不在 GUI 类中创建 Player 对象字段
  • 你的游戏变量仍然是一个本地变量!请重新阅读答案。而且您需要显示更多代码。代码不多,但更多。您正在调用getMenuName(),就好像它是保存您的 JLabel 的同一类中的一个方法,我们不知道它是否存在,但 Java 编译器(正确地)告诉您它不是。您只能在其类具有该方法的对象上调用该方法。
  • 您的问题与 Swing 无关,而与核心 Java 最基本的问题有关,即理解变量、引用和方法。例如,如果一个类具有getMenuName(),并且您需要调用此方法,则需要在该类的 instance 上调用它。你不能像你试图做的那样什么都不做。在需要的地方获取必要的变量,然后调用方法。

标签: java class object


【解决方案1】:

您的 GUI 需要一个 setPlayer1Name(String name) 方法,而您的 Player 类需要一个用于 playerName 字段的 get 和 set 方法。 Control 类将从用户那里获取名称,将设置播放器的名称。然后,Control 可以设置 GUI 的名称显示,或者如果 GUI(视图)有一个附加到 Player 的侦听器,它可以在设置或更改 Player 的名称时自动设置名称。

请注意,您对这段代码的问题是:

public void actionPerformed(ActionEvent arg0) {
     GameBoard game = new GameBoard(); // **** local variable
     game.main(null);
     String newPlayerName = playersName.getText();
     Player player1 = new Player(newPlayerName); // **** local variable
}

您将两个关键变量声明为方法的本地变量——它们对程序的其余部分完全不可见,这显然永远不会起作用。你需要在这里使用字段,而不是局部变量。s

所以不如这样做,....

public class FooClass {
   private Player player1;
   private GameBoard game;
   private JTextField playersName;
   private JLabel lblNewLabel1 = new JLabel();

   public FooClass() {
      JButton button = new JButton("Start");
      button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            game = new GameBoard(); // field
            game.main(null);
            String newPlayerName = playersName.getText();
            player1 = new Player(newPlayerName); // field
            lblNewLabel1.setText(newPlayerName); // set label
         }
      });
   }
}

【讨论】:

  • gui 的方法是什么?我试过这个,没有用。在某些时候,我必须在菜单中指定哪个播放器,这会导致错误。
  • @Cflo:见编辑。您的基本代码结构已损坏。当然,JLabel 代码看不到 player1,因为您已将其声明为 actionPerformed 方法的本地。不要这样做。将变量声明为类中的私有字段。
  • 谢谢气垫船,我已经在菜单类中完成了这项工作。现在我将如何从另一个类访问该对象的 getName 方法?遇到同样的错误,现在它没有在那里定义。
  • @Cflo:这只不过是对您需要访问的类的正确引用并调用它们的方法。只需将这里的想法扩展到您的其他情况。如果你有同样的问题,使用相同的通用解决方案来解决它。你可以做到,我知道你可以!
  • 我试图为菜单 gui 创建一个 getter 方法,但是我对这个对象很陌生,因为这似乎与对象无关,另一个类说该方法现在是未定义..
【解决方案2】:

它们是 2 个不同的类,因为您正在创建该类的一个对象,然后您使用您创建的新对象来调用它的变量或方法,所以:

Player player1 = new Player("player",0); // creating object
String PName = player1.playerName; //stores the name of player1 in PName.
System.out.println(player1.gamesWon); //outputs games won

如果您想更改该名称,则需要在执行该操作的 Player 类中创建一个方法

public void reName(String newName)
{
  playerName = newName;
}

然后调用其他类的方法

Player player1 = new Player("player",0); // creating object
player1.reName("Awesome");

您需要用于更改或使用 Player 类的任何方法都放在该类中,然后您只需调用这些方法..您可以重置分数或重命名或在该类中执行任何操作,只需创建一个方法并然后调用它。

【讨论】:

  • 但这并没有说明我将如何从不同的类修改该字符串
  • 抱歉,分心忘记添加了,有帮助吗?
  • 问题依然存在。我已成功更改名称,但现在我无法在本课程之外访问它。
  • 你是什么意思不能在课堂外访问它?哪一堂课??正如我所解释的,您可以使用您创建的对象来访问它,或者您可以创建一个返回它的方法..类似于public string getName(){return playerName;}
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2020-08-12
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多