2015-02-06 5 views
0

Я делаю игру для игры в стиле tic tac для класса, и игрок должен быть изгибом. Я использую windowbuilder для GUI, и в этом мы должны изменить имя игрока (часть объекта игрока). В другом классе, отдельно от игрока и класса меню, мы должны получить доступ к предмету игрока, чтобы захватить имя, используя геттер, чтобы отобразить его на экране. Мне нужно знать, как изменить объект из другого класса.Лучший способ изменить объекты, объявленные в других классах (Java)

Конструктор в классе игрока:

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 не объявлен в этом классе.

EDIT: Мы дошли до точки, где я могу сделать новый плеер в меню, и изменить его название, как показано здесь:

  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 не объявляется здесь.

+0

Почему вы не делаете поле объекта Player в классе GUI – mgokgoz

+0

Ваша переменная игры по-прежнему является ** локальной ** переменной! Пожалуйста, перечитайте ответы. И вам нужно показать больше кода. Не слишком много кода, но больше. Вы вызываете 'getMenuName()', как если бы это был метод того же класса, который содержит ваш JLabel, и мы понятия не имеем, есть оно или нет, но компилятор Java сообщает вам (правильно), что это не так. Вы можете вызвать метод только для объекта, класс которого имеет этот метод. –

+0

Ваша проблема не имеет ничего общего с Swing и все, что связано с ядром Java, по самой простой, понимающей переменные, ссылки и методы. Например, если класс имеет 'getMenuName()', и вам нужно вызвать этот метод, вам нужно вызвать его на * экземпляр * этого класса. Вы не можете называть это ничем, поскольку вы пытаетесь это сделать. Получите необходимую переменную там, где она вам нужна, а затем вызовите метод. –

ответ

1

Вашему GUI нужен метод setPlayer1Name(String name), а вашему классу Player нужен метод get и set для поля playerName. Класс Control получит имя от пользователя, установит имя Игрока. Затем элемент управления может установить отображение имени графического интерфейса пользователя, или если в графическом интерфейсе (представлении) есть прослушиватель, подключенный к проигрывателю, он может автоматически устанавливать имя, когда имя или имя игрока задано или изменено.

Обратите внимание, что ваша проблема с этим кодом является:

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 
} 

Вы объявляя две ключевые переменные как локальной для метода - они полностью невидимым для остальной части программы, и это, очевидно, будет никогда не работает. Вам нужно использовать поля здесь, а не локальные переменные.

Итак, вместо этого, ....

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 
     } 
     }); 
    } 
} 
+0

Что было бы в методе gui? Я пробовал это, безрезультатно. В какой-то момент я должен указать, какой игрок находится в меню, что приведет к ошибке. – Cflo

+0

@Cflo: см. Править. Структура основного кода нарушена. Конечно, код JLabel не может видеть player1, потому что вы объявили его локальным для метода actionPerformed. Не делай этого. Объявите переменную как частное поле в классе. –

+0

@Cflo: see next edit –

0

они 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 

если вы хотите изменить это имя, то вам нужно будет создать метод в классе игрока, который делает что

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

затем вызвать метод из другого класса

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

Любой метод, который вам нужно использовать для изменения или использования класса Player, входит в этот класс, тогда вы просто вызываете методы .. вы можете сбросить счет или переименовать или сделать что-либо в этом классе, просто создайте а затем вызвать его.

+0

Но это не говорит, как я изменил бы эту строку из другого класса – Cflo

+0

извините, отвлекся и забыл добавить его, помог ли он? – bakriawad

+0

Проблема все еще существует. Я успешно изменил имя, но теперь я не могу получить доступ к нему за пределами этого класса. – Cflo

Смежные вопросы