Мне нужно создать игру для одного из моих курсов Java (у меня есть некоторые базовые знания об объектно-ориентированном программировании на Java): я создал сцену javaFX (которая работает в режиме качания, используя JFXFrame) на класс это мой View , тогда у меня есть два других класса: один, который обрабатывает Game , и другой для создания объектов Player .
Теперь, когда игра запущена, игроков по очереди, и я хотел бы показать имя currentPlayer : я добавил этот атрибут в свой класс Game, и имя игрока SimpleStringProperty, потому что я читаю, с ним проще использовать слушателей.
Проблема в том, что я не понимаю, как это сделать ... Извините, мой вопрос может показаться глупым, но я действительно пытался в течение двух недель использовать слушателей во всех видах, и это ничего не делает: моя сцена javaFX не обновляется (мы не видим изменения имени currentPlayer).
Я читал о привязке , думал, что это может помочь, но я тоже не знаю, как это использовать.
Есть идеи или объяснения? Большое спасибо !
Вот как выглядит мой код:
// ВИД
public class TestView {
protected static Game game = new Game("Random Game");
protected static BorderPane root = new BorderPane();
protected static GridPane grilleHaut = new GridPane();
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestView.initialisation();
}
});
game.runSomething();
}
public static void initialisation() {
JFrame mainSwingFrame = new JFrame("Game");
JFXPanel mainFXFrame = new JFXPanel();
mainSwingFrame.add(mainFXFrame);
mainSwingFrame.setSize(1200, 900);
mainSwingFrame.setVisible(true);
mainSwingFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Platform.runLater(new Runnable() {
public void run() { initFX(mainFXFrame);}
} );
}
public static void initFX(JFXPanel frameFX) {
Scene scene = newScene();
frameFX.setScene(scene);
}
public static Scene newScene() {
Scene scene = new Scene(root, Color.LIGHTGOLDENRODYELLOW);
Text gameName = new Text(game.name);
grilleHaut.add(gameName, 0, 0);
GridPane.setConstraints(gameName, 0, 0, 1, 1, HPos.CENTER, VPos.TOP);
Text turn = new Text("It's " + game.currentPlayer.getName() + "'s turn to play.");
game.currentPlayer.name.addListener((observable, oldValue, newValue) -> {
turn.setText("C'est au tour de : " + newValue);
});
game.currentPlayer.name.addListener(new ChangeListener<String>() {
public void changed(ObservableValue<? extends String> o,String oldv,String newv) {
turn.setText("It's time to play for : " + newv);
System.out.println("accessed on TestView.");
}
});
grilleHaut.add(turn, 0, 1);
GridPane.setConstraints(turn, 0, 1, 1, 1, HPos.CENTER, VPos.CENTER);
BorderPane.setAlignment(grilleHaut, Pos.TOP_RIGHT);
root.setTop(grilleHaut);
return(scene);
}
}
// ИГРА
class Game {
String name;
Player p1 = new Player("Person 1");
Player p2 = new Player("Human 2");
Player currentPlayer;
public Game(String n) {
name=n;
currentPlayer = p1;
}
public void runSomething() {
//here goes code to run a game
System.out.println(currentPlayer.getName());
currentPlayer = p2; //at some point in the game, it's p2's time to play
String pressToContinue; Scanner ptc = new Scanner(System.in); pressToContinue = ptc.nextLine();
System.out.println(currentPlayer.getName());
currentPlayer = p1; //and then p1's again
String pressToContinue2; Scanner ptc2 = new Scanner(System.in); pressToContinue2 = ptc.nextLine();
System.out.println(currentPlayer.getName());
}
}
// ИГРОКИ
class Player {
protected StringProperty name = new SimpleStringProperty();
public Player(String n) {
name.setValue(n);
name.addListener(new ChangeListener<String>() {
public void changed(ObservableValue<? extends String> o,String oldv,String newv) {
Text turn = new Text("It's time to play for : " + newv);
TestView.grilleHaut.add(turn, 0, 1);
System.out.println("accessed on Player.");
}
});}
public String getName() { return name.getValue(); }
}