我有一个密钥,我想将其设置为使用循环生成的26个组合框中每个组合框的值,因此没有fx:id,我可以调用它来设置该值。
我有一个GUI,其中包含26个组合框或一个微调框,具体取决于特定其他组合框的值。这些是由枚举器自动生成的,该枚举器将它们加载到我的GUI上的空白空间中(我已经设置了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(在其中生成了replaceKeyEditorView的位置)执行所有这些操作。在这里,我有一个char数组字母[26],我想将由replacementKeyEditorView生成的每个组合框的值设置为此数组中特定索引的值。
我希望这是有道理的!
答案 0 :(得分:0)
我猜测您仅使用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);
}
}