JavaFX: способ изменить значение программно созданных кнопок - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь изменить значение кнопок, которые создаются в для l oop. Значение кнопок должно быть сохранено в хэш-карте, которая содержит идентификатор кнопки и значение.

Это то, что у меня сейчас есть:

private void createMap(int blocksX, int blocksY) {
        // blocksX and blocksY are the amount of buttons to be placed
        for (int x = 0; x < blocksX; x++) {
            for (int y = 0; y < blocksY; y++) {
                Button btn = new Button();
                btn.setText("0");
                btn.setPrefSize(32, 32);
                btn.setLayoutX(32 * x);
                btn.setLayoutY(32 * y);
                btn.setId(String.valueOf(button_id));
                map_list.put(button_id, 0);
                button_id+=1;
                items.getChildren().addAll(btn);
                // If the user clicks a button, change the value of it...
                btn.setOnAction(click -> {
                    if(btn.getText() == "0"){
                        changeButtonValue(Integer.parseInt(btn.getId()), 1);
                        btn.setText("1");
                    } else if(btn.getText() == "1") {
                        changeButtonValue(Integer.parseInt(btn.getId()), 0);
                        btn.setText("0");
                    }
                });
            }
        }
    }

Но теперь единственный элемент в HashMap, который нужно обновить, - это последняя созданная кнопка. Как я могу изменить это, чтобы он обновлял все значения кнопок?

1 Ответ

0 голосов
/ 06 апреля 2020

Я выполнил код для работающего примера. И я не вижу твоей проблемы.

import java.util.HashMap;
import java.util.Map;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class FX01 extends Application {
    public int button_id = 0;
    public Map<Integer, Integer> map_list = new HashMap<>();
    public AnchorPane items;

    public static void main(String[] args) {
        launch(args);

    }

    @Override
    public void start(Stage stage) throws Exception {
        items = new AnchorPane();
        createMap(5, 5);

        Scene scene = new Scene(items);
        stage.setScene(scene);

        stage.show();
    }


    private void createMap(int blocksX, int blocksY) {
        // blocksX and blocksY are the amount of buttons to be placed
        for (int x = 0; x < blocksX; x++) {
            for (int y = 0; y < blocksY; y++) {
                Button btn = new Button();
                btn.setText("0");
                btn.setPrefSize(32, 32);
                btn.setLayoutX(32 * x);
                btn.setLayoutY(32 * y);
                btn.setId(String.valueOf(button_id));
                map_list.put(button_id, 0);
                button_id+=1;
                items.getChildren().addAll(btn);
                // If the user clicks a button, change the value of it...
                btn.setOnAction(click -> {
                    if(btn.getText() == "0"){
                        changeButtonValue(Integer.parseInt(btn.getId()), 1);
                        btn.setText("1");
                    } else if(btn.getText() == "1") {
                        changeButtonValue(Integer.parseInt(btn.getId()), 0);
                        btn.setText("0");
                    }
                });
            }
        }
    }

    private void changeButtonValue(int id, int value) {
        map_list.put(id, value);
        System.out.println("map_list: " + map_list);
    }
}
...