gpt4 book ai didi

binding - JavaFx : binding of a ObjectProperty with a ObjectProperty

转载 作者:行者123 更新时间:2023-12-02 10:11:30 26 4
gpt4 key购买 nike

我有一个带有 NumberSpinner 的场景元素和 ComboBox元素,我想绑定(bind) minValue NumberSpinner的属性(property)valueProperty 为 ComboBox 的元素元素。一些代码:

@FXML
private NumberSpinner aNumberSpinner;
@FXML
private ComboBox<Unit> aComboBox;

哪里Unitenum :

public enum Unit {

mm,
degree
}

我想要的是当我选择degreeUnitaComboBox minValueProperty()aNumberSpinner成为10 。我怎样才能实现它?

最佳答案

正如 Kleopatra 在评论中建议的那样,最好单位知道自己的最小值。

首选解决方案 - 无绑定(bind)

我的首选解决方案根本不使用绑定(bind)。

组合框值的监听器可以通过查询组合框中新选择的单位的最小值,轻松地将微调器对象的最小值直接设置为适当的值。

有时绑定(bind)可能有点过于棘手......

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class UnitMinimums extends Application {
private enum Unit {
mm(0), degree(10);

private final int minValue;

private Unit(int minValue) {
this.minValue = minValue;
}

public int getMinValue() {
return minValue;
}
}

private Slider slider = new Slider(0, 20, 0);

private ComboBox<Unit> combo = new ComboBox<>(
FXCollections.observableArrayList(
Unit.values()
)
);

@Override
public void start(Stage stage) throws Exception {
combo.valueProperty().addListener((observable, oldValue, newValue) ->
slider.setMin(newValue.getMinValue())
);
slider.setShowTickMarks(true);
slider.setShowTickLabels(true);

VBox layout = new VBox(5, slider, combo);
layout.setPadding(new Insets(10));
VBox.setVgrow(combo, Priority.ALWAYS);
combo.setMaxWidth(Double.MAX_VALUE);
combo.getSelectionModel().select(0);

stage.setScene(new Scene(layout));
stage.show();
}

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

纯结合解决方案

如果您确实想要一个纯绑定(bind)解决方案,您可以执行如下操作,但它的缺点是将特定于单位最小值(这是枚举固有的)的信息分散在代码周围,如果您开始经常编写这样的代码。

使用Bindings.when :

Bindings.when(
combo.valueProperty().isEqualTo(Unit.degree)
).then(10)
.otherwise(0)

可执行示例

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class BoundMinimums extends Application {
private enum Unit { mm, degree }

private Slider slider = new Slider(0, 20, 0);

private ComboBox<Unit> combo = new ComboBox<>(
FXCollections.observableArrayList(
Unit.values()
)
);

@Override
public void start(Stage stage) throws Exception {
slider.minProperty().bind(
Bindings.when(
combo.valueProperty().isEqualTo(Unit.degree)
).then(10)
.otherwise(0)
);
slider.setShowTickMarks(true);
slider.setShowTickLabels(true);

VBox layout = new VBox(5, slider, combo);
layout.setPadding(new Insets(10));
VBox.setVgrow(combo, Priority.ALWAYS);
combo.setMaxWidth(Double.MAX_VALUE);

stage.setScene(new Scene(layout));
stage.show();
}

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

关于数据类型转换

这对我来说有点复杂和不明显(这是有时更喜欢听众和直接设置者而不是绑定(bind)的另一个原因),但我认为你可以做如下的事情,这会隐藏 DoubleProperty slider.minProperty()ObjectProperty<Integer> :

ObjectProperty<Integer> op = new SimpleObjectProperty<>(5);
op.bind(
IntegerExpression.integerExpression(
slider.minProperty()
).asObject()
);

将其与单位转换放在一起,您将得到以下结果,这甚至可能满足您的要求:

ObjectProperty<Integer> op = new SimpleObjectProperty<>(5);
op.bind(
IntegerExpression.integerExpression(
Bindings.when(
combo.valueProperty().isEqualTo(Unit.degree)
).then(10)
.otherwise(0)
).asObject()
);

关于binding - JavaFx : binding of a ObjectProperty<Integer> with a ObjectProperty<Unit>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24384406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com