Подождите, пока кнопка будет нажата JAVA GUI - PullRequest
0 голосов
/ 08 апреля 2020

В данный момент я переписываю текстовую программу, чтобы иметь GUI. Одна из проблем, с которыми я сталкиваюсь, заключается в том, что я хочу, чтобы программа ожидала выполнения определенного условия. Это условие может быть выполнено, если пользователь нажимает кнопку «Прогулка» до тех пор, пока атрибут player.walked не будет = 5. При использовании текстового интерфейса это довольно просто, используйте команду while l oop, и внутри есть функция ввода.

while (player.getWalked() < 5) {
     //wait for user input via terminal through the scanner.
}

Однако при использовании GUI и желании следовать подходу Model-View Controller (т.е. разделить игровую механику и пользовательский интерфейс отдельно) это становится довольно сложным. После попытки реализовать GUI моя программа продолжает зависать, пока l oop пусто. Я попытаюсь доказать это ниже, но это довольно запутанно. Прошу прощения, если это непрофессионально.

World Class:

public static void play(Player player) throws FileNotFoundException, IOException, ClassNotFoundException{ // play method is the centralised place for all in-game simulation and user interaction.
    welcome(player);
    while (player.getWalked() <5) {

    }

GUI Class:

Button walk_button = new Button("Walk");
      walk_button.setBounds(195, 395, 100,100);
      add(walk_button);
      walk_button.addActionListener((new ActionListener(){ 
        public void actionPerformed(ActionEvent evt) {
            try{
                label1.setVisible(false);
                label.setText(player.interaction("W"));
                label.setBounds(200,50,400,100);
                }
            catch (FileNotFoundException e) {System.out.println(e.getMessage());} catch (IOException e) {System.out.println(e.getMessage());} catch (ClassNotFoundException e) {System.out.println(e.getMessage());} 
            } 
        }));

Класс игрока, состоящий из метода interaction:

public String interaction(String input) throws FileNotFoundException, IOException, ClassNotFoundException{ 
//String input = World.input("You have walked "+getWalked()+" miles so far.\nOnly "+(END_POINT - walked)+" miles until you reach the end of the town.\nPress 'w' to walk.\nPress 'c' to change weapon equipped.\nPress 's' to save and exit.");
if (input.equals("W")) {
   return walk(World.dice(4,1));
}

Если кто-нибудь сможет найти решение этой проблемы, я был бы очень признателен. Конечная цель заключается в том, чтобы программа продолжала работать (позволить игроку продолжать нажимать кнопку «Ходить») до тех пор, пока l oop не сломается.

Большое спасибо и извинения, если это довольно долго , запутанный и непрофессиональный.

1 Ответ

1 голос
/ 08 апреля 2020

Не очень хорошая идея иметь пустые циклы while, поэтому я бы посоветовал проверить позицию игрока с помощью оператора if в том же методе, в котором он установлен (сразу после триггера кнопки actionPerformed), а затем продолжить с там. Я не могу дать вам конкретную c реализацию, потому что я не знаю, что вы хотите сделать.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я имел в виду что-то вроде этого:

public void actionPerformed(ActionEvent evt) {
  //set player's walked distance ...
  //...
  if (player.getWalked() > 5) {
    //put all your logic here, or extract to a method
  }
}

Примечание: вместо нескольких блоков перехвата, где вы делаете одно и то же, просто используйте FileNotFoundException | ClassNotFoundException | и др c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...