JavaFX - 无法将 ToggleButtons 放入 ToggleGroup
JavaFX - cannot get ToggleButtons into ToggleGroup
我有一个应用程序,用户应该可以 select 只有一个按钮。
我的问题是,我无法将 ToggleButton
放入 ToggleGroup
,这应该可以解决我的问题。
我使用 if 语句创建了 ToggleButton
。我将代码缩减为重要部分。
有帮助吗?
我的代码:
public SymbolTableCell() {
}
@FXML
public void initialize() {
collectFonts();
buildGridPaneAddButtons();
listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
buildGridPaneAddButtons();
@FXML
public void buildGridPaneAddButtons() {
gridPane.getChildren().clear();
int numRows = 14;
int numColumns = 14;
for (int row = 0; row < numRows; row++) {
RowConstraints rc = new RowConstraints();
rc.setFillHeight(true);
rc.setVgrow(Priority.ALWAYS);
gridPane.getRowConstraints().add(rc);
}
for (int col = 0; col < numColumns; col++) {
ColumnConstraints cc = new ColumnConstraints();
cc.setFillWidth(true);
cc.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(cc);
}
String selectedFamily = listView.getSelectionModel().getSelectedItem();
if (selectedFamily != null) {
System.out.println("selected Font: '" + selectedFamily + "'");
for (int i = 0; i < 196; i++) {
Font selectedFont = Font.font(selectedFamily, 18.0);
Character character = new Character((char) (i));
java.awt.Font awtFont = new java.awt.Font(selectedFamily, 0, 40);
if (awtFont.canDisplay(character.charValue()) {
ToggleButton buttonForSymbols = createButton("" + character);
buttonForSymbols.setFont(selectedFont);
buttonForSymbols.setAlignment(Pos.CENTER);
// Here I try to get the ToggleButtons into the Group.
ToggleGroup groupForToggleButtons = new ToggleGroup();
buttonForSymbols.setToggleGroup(groupForToggleButtons);
HBox symbolHBox = new HBox();
symbolHBox.getChildren().add(buttonForSymbols);
Label symbolLabel = new Label();
symbolLabel.setText("" + i);
Separator symbolSeparator = new Separator();
BorderPane symbolBorderPane = new BorderPane();
symbolBorderPane.setTop(symbolHBox);
symbolBorderPane.setCenter(symbolSeparator);
symbolBorderPane.setBottom(symbolLabel);
symbolLabel.setAlignment(Pos.CENTER);
symbolBorderPane.setAlignment(symbolLabel, Pos.CENTER);
// when ToggleButton selected, set new Style of BorderPane
symbolBorderPane.styleProperty()
.bind(Bindings.when(buttonForSymbols.selectedProperty())
.then("-fx-border-color: red; -fx-border-width: 1.5;")
.otherwise("-fx-border-color: black; -fx-border-width: 1;"));
gridPane.add(symbolBorderPane, i % numRows, i / numColumns);
}
}
}
}
// ToggleButton to use .then .otherwise style properties
private ToggleButton createButton(String text) {
ToggleButton buttonPanelForSymbols = new ToggleButton(text);
buttonPanelForSymbols.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
buttonPanelForSymbols.setOnAction(e -> System.out.println("ok"));
buttonPanelForSymbols.setStyle(
"-fx-border-color: transparent; -fx-border-width: 0; -fx-background-radius: 0; -fx-background-color: transparent;");
return buttonPanelForSymbols;
}
这一行:
ToggleGroup groupForToggleButtons = new ToggleGroup();
当您在生成按钮的 for loop
中执行此命令时,您正在为每个 ToggleButton
创建一个新的 ToggleGroup
。
在循环外创建 ToggleGroup
:
ToggleGroup groupForToggleButtons = new ToggleGroup();
for (int i = 0; i < 196; i++) {
...
}
然后在循环内为每个 ToggleButton
使用此 ToggleGroup
实例(删除循环内的 ToggleGroup
初始化)。
注意:您甚至可以将其封装在 createButton
方法中:
private ToggleButton createButton(String text, ToggleGroup group) {
ToggleButton buttonPanelForSymbols = new ToggleButton(text);
// Current code here
buttonPanelForSymbols.setToggleGroup(group)
return buttonPanelForSymbols;
}
然后在循环中:
ToggleButton buttonForSymbols = createButton("" + character, groupForToggleButtons);
同时从循环中删除每个 ToggleGroup
相关。
我有一个应用程序,用户应该可以 select 只有一个按钮。
我的问题是,我无法将 ToggleButton
放入 ToggleGroup
,这应该可以解决我的问题。
我使用 if 语句创建了 ToggleButton
。我将代码缩减为重要部分。
有帮助吗?
我的代码:
public SymbolTableCell() {
}
@FXML
public void initialize() {
collectFonts();
buildGridPaneAddButtons();
listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
buildGridPaneAddButtons();
@FXML
public void buildGridPaneAddButtons() {
gridPane.getChildren().clear();
int numRows = 14;
int numColumns = 14;
for (int row = 0; row < numRows; row++) {
RowConstraints rc = new RowConstraints();
rc.setFillHeight(true);
rc.setVgrow(Priority.ALWAYS);
gridPane.getRowConstraints().add(rc);
}
for (int col = 0; col < numColumns; col++) {
ColumnConstraints cc = new ColumnConstraints();
cc.setFillWidth(true);
cc.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(cc);
}
String selectedFamily = listView.getSelectionModel().getSelectedItem();
if (selectedFamily != null) {
System.out.println("selected Font: '" + selectedFamily + "'");
for (int i = 0; i < 196; i++) {
Font selectedFont = Font.font(selectedFamily, 18.0);
Character character = new Character((char) (i));
java.awt.Font awtFont = new java.awt.Font(selectedFamily, 0, 40);
if (awtFont.canDisplay(character.charValue()) {
ToggleButton buttonForSymbols = createButton("" + character);
buttonForSymbols.setFont(selectedFont);
buttonForSymbols.setAlignment(Pos.CENTER);
// Here I try to get the ToggleButtons into the Group.
ToggleGroup groupForToggleButtons = new ToggleGroup();
buttonForSymbols.setToggleGroup(groupForToggleButtons);
HBox symbolHBox = new HBox();
symbolHBox.getChildren().add(buttonForSymbols);
Label symbolLabel = new Label();
symbolLabel.setText("" + i);
Separator symbolSeparator = new Separator();
BorderPane symbolBorderPane = new BorderPane();
symbolBorderPane.setTop(symbolHBox);
symbolBorderPane.setCenter(symbolSeparator);
symbolBorderPane.setBottom(symbolLabel);
symbolLabel.setAlignment(Pos.CENTER);
symbolBorderPane.setAlignment(symbolLabel, Pos.CENTER);
// when ToggleButton selected, set new Style of BorderPane
symbolBorderPane.styleProperty()
.bind(Bindings.when(buttonForSymbols.selectedProperty())
.then("-fx-border-color: red; -fx-border-width: 1.5;")
.otherwise("-fx-border-color: black; -fx-border-width: 1;"));
gridPane.add(symbolBorderPane, i % numRows, i / numColumns);
}
}
}
}
// ToggleButton to use .then .otherwise style properties
private ToggleButton createButton(String text) {
ToggleButton buttonPanelForSymbols = new ToggleButton(text);
buttonPanelForSymbols.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
buttonPanelForSymbols.setOnAction(e -> System.out.println("ok"));
buttonPanelForSymbols.setStyle(
"-fx-border-color: transparent; -fx-border-width: 0; -fx-background-radius: 0; -fx-background-color: transparent;");
return buttonPanelForSymbols;
}
这一行:
ToggleGroup groupForToggleButtons = new ToggleGroup();
当您在生成按钮的 for loop
中执行此命令时,您正在为每个 ToggleButton
创建一个新的 ToggleGroup
。
在循环外创建 ToggleGroup
:
ToggleGroup groupForToggleButtons = new ToggleGroup();
for (int i = 0; i < 196; i++) {
...
}
然后在循环内为每个 ToggleButton
使用此 ToggleGroup
实例(删除循环内的 ToggleGroup
初始化)。
注意:您甚至可以将其封装在 createButton
方法中:
private ToggleButton createButton(String text, ToggleGroup group) {
ToggleButton buttonPanelForSymbols = new ToggleButton(text);
// Current code here
buttonPanelForSymbols.setToggleGroup(group)
return buttonPanelForSymbols;
}
然后在循环中:
ToggleButton buttonForSymbols = createButton("" + character, groupForToggleButtons);
同时从循环中删除每个 ToggleGroup
相关。