Слушайте изменения в массиве - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужна помощь, если вы можете уделить несколько минут.Я немного расстроен, когда пытаюсь заставить это работать.

У меня есть такой класс javaFX

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FoorballTeam extends Application {
int i1=0;  
int i3=0;
String[] PlayerNames = new String[12];
int[] goals = new int[12];

@Override
public void start(Stage primaryStage) {

    player[] playerData = new player[12];

    Button btn = new Button();
    btn.setText("add Player");

    GridPane root = new GridPane();
    root.add(btn,0,0);

    int i2;
    for (i2=0;i2<=11;i2++)
    {playerData[i2]=new player();}        

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {

           playerData[i3].player(root, i3);
           i3++; 

        }
    });

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public String[] getPlayerNames() {
    return PlayerNames;
}

public void setPlayerNames(String[] PlayerNames) {
    this.PlayerNames = PlayerNames;
}

public int[] getGoals() {
    return goals;
}

public void setGoals(int[] goals) {
    this.goals = goals;
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

и второй класс с именем player, такой как

import javafx.event.EventType;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;

public class player {

String NameOfPlayer = new String();    
int goalsOfPlayer;

public void player (GridPane root,int numberOfPlayer) 
{

TextField name = new TextField();
TextField goals = new TextField();

GridPane grid = new GridPane();
grid.add(name,0,0);
grid.add(goals,1,0);
root.add(grid,0,numberOfPlayer+1);

System.out.println("player " + numberOfPlayer + " added");

name.textProperty().addListener((observable, oldValue, newValue) -> {
NameOfPlayer=newValue;

}); 

goals.textProperty().addListener((observable, oldValue, newValue) -> {
goalsOfPlayer=Integer.parseInt(newValue);
});    


}
}

Я хочу, чтобы каждый раз, когда я вносил изменения в имена или цели игроков, передавал эти изменения в два массива PlayerNames [] и goal [] основного класса.например, если игрок1 меняет цели с 1 на 2, я хочу, чтобы цели [1] = 2.Также возможно поместить слушателя в эти два массива, чтобы, когда игрок меняет имя или цели, чтобы вызвать слушателя.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 20 декабря 2018

Одним из простых решений является деформация массива int[] с помощью наблюдаемого списка и прослушивание изменений в этом списке:

import java.util.Arrays;
import java.util.Random;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class ListenToArrayCahnges extends Application {

    private final int SIZE = 12;
    private final Integer[] goals = new Integer[SIZE];
    private final Random rand = new Random();
    private int counter = 0;

    @Override
    public void start(Stage primaryStage) {

        Arrays.fill(goals, 0); //initial values
        //Warp array with an observable list. list back by array so it is of fixed length
        ObservableList<Integer> goalsList = FXCollections.observableArrayList(Arrays.asList(goals));
        //add listener to list
        goalsList.addListener((ListChangeListener<Integer>) c ->{
            //respond to list changes
            System.out.println("Goals changed to : "+ goalsList);
        });
        //button to change the list
        Button btn = new Button();
        btn.setText("Add goal");    
        btn.setOnAction(event -> {
            goalsList.set(counter,  rand.nextInt(100));
            counter = ++counter % SIZE ; //increment counter 0,1,2....11 and back to 0
        });

        GridPane root = new GridPane();
        root.add(btn,0,0);

        Scene scene = new Scene(root, 150, 50);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

Обратите внимание, что отправленный mcve представляет проблема , которая должна быть решена (или в данном случае ее решение), а не конкретное приложение или вариант использования.

...