Как установить значение поля со списком в значение массива, если поле со списком не идентифицируется однозначно? - PullRequest
0 голосов
/ 31 января 2019

У меня есть ключ, который я хочу установить в значение каждого из 26 полей со списком, которые я сгенерировал с помощью цикла, следовательно, у меня нет fx: id, который я могу вызвать, чтобы установить значение.

У меня есть графический интерфейс, который содержит 26 комбинированных блоков или счетчик, в зависимости от значения другого комбинированного блока.Они автоматически генерируются перечислителем, который загружает их в пустое место в моем графическом интерфейсе (я установил 26 комбинированных полей, которые я сгенерирую, кодируя 1 из них (все они имеют одинаковые значения внутри) и используя цикл для генерации26 из них).Для 26 полей со списком у меня есть массив char [26], в котором я хочу установить для каждого поля со списком другое значение в массиве, но, поскольку они были сгенерированы с помощью цикла, я не могу установить уникальный fx: id для каждого поля со списком, чтобы я мог вызвать их, чтобы установить значения.Я думаю, что мне нужно как-то привязать их к массиву, но я очень плохо знаком с javafx / fxml, поэтому не знаю, как это сделать.

Это создает поля со списком:

private SubstitutionKey key;

public SubstitutionKeyEditorView(SubstitutionKey key) {
    this.key = key;
    FXMLLoader loader = new FXMLLoader(getClass().getResource("SubstitutionKeyEditor.fxml"));
    loader.setController(this);
    loader.setRoot(this);
    try {
        loader.load();
        for (char x = 'A'; x <= 'Z'; x++) {
            getChildren().add(new LetterSelectorView(String.valueOf(x), this)); //add 26 letter selectors (26 combo boxes)
        }
    } catch (IOException exc) {
        throw new RuntimeException(exc);
    }
}

SubstitutionKeyEditor.fxml только устанавливает тип для flowPane, поэтому они хорошо отображаются.

Это letterSelectorView:

@FXML
private Label letterLabel;
@FXML
private ComboBox letterSelection;

public LetterSelectorView(String letter, LetterChangedListener listener) {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("LetterSelector.fxml"));
    //add the text and combo box to the place being loaded into
    loader.setController(this);
    loader.setRoot(this);
    try {
        loader.load();
        letterLabel.setText(letter); //give the label the correct letter
        letterSelection.getItems().add(" "); //add blank
        for (char x = 'A'; x <= 'Z'; x++) {
            letterSelection.getItems().add(String.valueOf(x)); //add all the letters to each combo box
        }
        letterSelection.valueProperty().addListener((obs, oldValue, newValue) -> listener.letterChanged(letter, (String) newValue));
        //if value of combo box changes, rerun cipher
    } catch (IOException exc) {
        throw new RuntimeException(exc);
    }
}

Я пытаюсь сделать все это из другого контроллера CipherController (в котором генерируется substitutionKeyEditorView).Здесь у меня есть буквы массива char [26], которые я хочу установить для каждого поля со списком, сгенерированного substitutionKeyEditorView, равным значению определенного индекса в этом массиве.

Надеюсь, это имеет смысл!

1 Ответ

0 голосов
/ 31 января 2019

Я предполагаю, что вы, вероятно, можете обойти вашу проблему, просто используя List и индекс List.Не уверен на 100%, потому что в вашем вопросе отсутствует MCVE .

Если вам нужно установить UserData, я думаю, что это должно быть сделано при создании ComboBox.

Пример:

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication329 extends Application
{

    ComboBox<String> mainComboBox = new ComboBox();
    List<ComboBox<String>> comboBoxes = new ArrayList();
    String[] data = "ABCDE".split("");
    String[] value = "01234".split("");

    @Override
    public void start(Stage primaryStage)
    {
        mainComboBox.setItems(FXCollections.observableArrayList(value));
        mainComboBox.setValue("0");

        for (int i = 0; i < data.length; i++) {
            ComboBox<String> tempComboBox = new ComboBox<>(FXCollections.observableArrayList(data));
            tempComboBox.setUserData("ComboBox" + i);//If you need to set the UserData or you can just use the List index
            tempComboBox.setValue(data[i]);
            comboBoxes.add(tempComboBox);
        }

        mainComboBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> {
            for (int i = 0; i < data.length; i++) {
                String tempValue = data[(newValue.intValue() + i) % 5];
                comboBoxes.get(i).setValue(tempValue);
            }
        });

        VBox vBox = new VBox(mainComboBox);
        vBox.getChildren().addAll(comboBoxes);

        StackPane root = new StackPane(vBox);

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

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

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

}
...