聆听数组中的更改

时间:2018-12-15 08:20:20

标签: java arrays javafx observable

如果您能花几分钟的时间,我需要一些帮助。 尝试进行此工作时,我有点不高兴。

我有一个像这样的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);
}

}

和第二个像这样的玩家

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 :(得分:0)

一种简单的解决方案是使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代表需要解决的问题(或在这种情况下为解决方案),而不是特定的应用或用例。