修改在其他 类 (Java) 中声明的对象的最佳方法

Best way to modify objects declared in other classes (Java)

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

修改一个对象

播放器中的一个构造函数class:

    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 对象未在此 class 中声明。

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

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

        }

菜单class中有其他适用的方法

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

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

        JLabel lblNewLabel_1 = new JLabel(getMenuName());

但是,这里没有声明 getMenuName。

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

请注意,此代码的问题是:

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
}

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

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

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 class 中创建一个方法

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

然后从另一个调用方法class

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

您需要用来更改或使用播放器 class 的任何方法都在那个 class 中,然后您只需调用这些方法..您可以重置分数或重命名或做class 中的任何内容,只需创建一个方法然后调用它即可。