Здесь немного проблем. Итак, у меня есть два класса: GUIBuilder и класс, который имитирует игру жизни Конвея с использованием 2D-массивов. GUI создает сетку квадратов для выбранных пользователем размеров, а затем позволяет им выбрать, какие квадраты "живы" и "мертвы", чтобы начать, затем они указывают, сколько поколений будет работать симуляция, и запускают симуляцию запуска. кнопка. Сетка квадратов обновится, чтобы отразить новые границы, а также то, какие квадраты теперь «живы», а какие «мертвы» для каждого поколения.
Изначально я настроил класс жизни игры Конвея для распечатки. 2D-массив, который он создает для каждого поколения в качестве выходных данных, но теперь я хочу вызвать класс в GUI Builder, чтобы обновить сетку GUI квадратов, причем каждый квадрат имеет свой цвет, чтобы показать его статус вместо этих вывод на печать. В GUI нажимается кнопка для вызова класса Conway со спецификациями для моделирования, затем класс Conway запускает приостановку моделирования в конце каждого поколения, чтобы обновить GUI, чтобы отразить новое состояние моделирования.
Каждый раз, когда вызывается метод обновления в классе построителя GUI, возникает пауза, чтобы показать ход симуляции.
Я также использую JavaFX для создания GUI
Итак, вот код для события кнопки Start Simulation. Он вызовет метод в Conway, передавая 2D-массив всей стартовой вселенной
startSimulationButton.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
if(validateTextBox(genTextField))
{
int[][] universe = convertTo2DArray(simulationPane);
int generations = Integer.parseInt(genTextField.getText());
ConwayLife simStart = new ConwayLife();
simStart.getGeneration(universe, generations);
}
else
{
instructionLabel.setText("Didn't put numbers in ya silly billy");
}
}
});
Вот метод обновления GUI, который я хочу вызывать из класса Conway
private void updateSimulationPane(int[][] universe, int xUpdate, int yUpdate) throws InterruptedException
{
clearSimulationGrid(simulationPane);
int[] flatUniverse = Stream.of(universe).flatMapToInt(IntStream::of).toArray();
for(int counter = 0; counter < (xUpdate*yUpdate); counter++)
{
Rectangle rect = new Rectangle(0, 0, squareDimensions, squareDimensions);
if(flatUniverse[counter] == 1)
{
rect.setFill(Color.DARKGREEN);
}
else
{
rect.setFill(Color.GREY);
}
simulationPane.add(rect, (counter) % xInput, (counter) / xInput);
}
double leftAnchor = (xWindow / 2) - ((squareDimensions * xInput) / 2);
gridAnchorPane.setTopAnchor(simulationPane, 100d);
gridAnchorPane.setLeftAnchor(simulationPane, leftAnchor);
Thread.sleep(5000);
}
и, наконец, вот точка в классе Конвея, которую я хотел бы обновить GUI
if(deadCells == i * j) //if there are no more alive cells
{
int[][] emptyArray = new int[0][0];
/*
//******Last Generation plus Empty set output*********
System.out.println("Generation: " + counter);
for(int elcounto = 0; elcounto < oldGeneration.length; elcounto++)
{
System.out.println(Arrays.toString(oldGeneration[elcounto]));
}
System.out.println("Generation: " + (counter + 1) + "\nSociety died out");
System.out.println(Arrays.deepToString(emptyArray));
//****************************************************
*/
//call updateSimulationPane here
return emptyArray; //return an empty set to show that the society died out
}
/*
//******Generation Check Output*********
System.out.println("Generation: " + counter);
for(int elcounto = 0; elcounto < oldGeneration.length; elcounto++)
{
System.out.println(Arrays.toString(oldGeneration[elcounto]));
}
System.out.println();
//**************************************
*/
//call updateSimulationPane here
oldGeneration = newGeneration; //make the new generation the old generation to show passing of a generation
newGeneration = new int[oldGeneration.length + bounds][oldGeneration[0].length + bounds]; //em
}
return trim(oldGeneration);
Сторона Конвея сейчас довольно груба, но пока я могу перезвонить и обновить GUI Я смогу отработать все перегибы на этом конце. В основном просто хочу исправить взаимодействие с классом. Надеюсь, этого достаточно, чтобы понять, что я пытаюсь сделать.