防止切换组未选择切换 - Java FX
Prevent a toggle group from not having a toggle selected - Java FX
我有一个带有两个切换按钮的切换组,应该如下所示(黄色切换是选定的切换)。
但是,当我单击选定的切换按钮时,两个切换按钮都未被选中,看起来像这样。
然后如果我尝试获取切换是否被选中,我会得到 nullPointerException
。
(Boolean) toggleGroup.getSelectedToggle().getUserData();
是否可以防止选中的切换按钮在单击时被取消选中?
您可以尝试以下代码来创建持久切换。
/**
* Create a toggle group of buttons where one toggle will always remain switched on.
*/
class PersistentButtonToggleGroup extends ToggleGroup {
PersistentButtonToggleGroup() {
super();
getToggles().addListener(new ListChangeListener<Toggle>() {
@Override public void onChanged(Change<? extends Toggle> c) {
while (c.next()) {
for (final Toggle addedToggle : c.getAddedSubList()) {
((ToggleButton) addedToggle).addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if (addedToggle.equals(getSelectedToggle())) mouseEvent.consume();
}
});
}
}
}
});
}
}
这只是对鼠标事件做出反应,因此如果您想考虑键盘事件或更改代码中的切换,可能并不理想。
博客条目 Button of Choice: Use ToggleButtons as RadioButtons.
中可能定义了一种我尚未尝试过的类似但也许更完整的方法
也许实现您想要的最简单的行为可能是只使用 RadioButtons 而不是 ToggleButtons。
此外,如果您希望按钮的样式像 ToggleButtons 而不是 RadioButtons,那么您可以尝试以下概述的样式技术:。
RadioButton radioButton=new RadioButton("Radio");
radioButton.getStyleClass().remove("radio-button");
radioButton.getStyleClass().add("toggle-button");
这个对我有用。如果新的 selected 元素为空,这意味着没有 selected 元素,因此只有 select 前一个(即 "oldValue")
toggleGroup.selectedToggleProperty().addListener((obsVal, oldVal, newVal) -> {
if (newVal == null)
oldVal.setSelected(true);
});
我有一个带有两个切换按钮的切换组,应该如下所示(黄色切换是选定的切换)。
但是,当我单击选定的切换按钮时,两个切换按钮都未被选中,看起来像这样。
然后如果我尝试获取切换是否被选中,我会得到 nullPointerException
。
(Boolean) toggleGroup.getSelectedToggle().getUserData();
是否可以防止选中的切换按钮在单击时被取消选中?
您可以尝试以下代码来创建持久切换。
/**
* Create a toggle group of buttons where one toggle will always remain switched on.
*/
class PersistentButtonToggleGroup extends ToggleGroup {
PersistentButtonToggleGroup() {
super();
getToggles().addListener(new ListChangeListener<Toggle>() {
@Override public void onChanged(Change<? extends Toggle> c) {
while (c.next()) {
for (final Toggle addedToggle : c.getAddedSubList()) {
((ToggleButton) addedToggle).addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if (addedToggle.equals(getSelectedToggle())) mouseEvent.consume();
}
});
}
}
}
});
}
}
这只是对鼠标事件做出反应,因此如果您想考虑键盘事件或更改代码中的切换,可能并不理想。
博客条目 Button of Choice: Use ToggleButtons as RadioButtons.
中可能定义了一种我尚未尝试过的类似但也许更完整的方法也许实现您想要的最简单的行为可能是只使用 RadioButtons 而不是 ToggleButtons。
此外,如果您希望按钮的样式像 ToggleButtons 而不是 RadioButtons,那么您可以尝试以下概述的样式技术:
RadioButton radioButton=new RadioButton("Radio");
radioButton.getStyleClass().remove("radio-button");
radioButton.getStyleClass().add("toggle-button");
这个对我有用。如果新的 selected 元素为空,这意味着没有 selected 元素,因此只有 select 前一个(即 "oldValue")
toggleGroup.selectedToggleProperty().addListener((obsVal, oldVal, newVal) -> {
if (newVal == null)
oldVal.setSelected(true);
});