我的JavaFX应用程序中有两个微调器和一个切换按钮,并且我也将它们设置为可编辑
Spinner<Integer> hSelector = new Spinner<>(1,15000,1000,1);
Spinner<Integer> wSelector = new Spinner<>(1,15000,1000,1);
hSelector.setEditable(true);
wSelector.setEditable(true);
ToggleButton lock = new ToggleButton("lock");
选择此lock
切换按钮后,我要保持hSelector
和wSelector
值的比率。所以我尝试关注,
lock.selectedProperty().addListener((observable, oldValue, newValue) -> {
if(newValue){
hSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
wSelector.getEditor().setText(String.valueOf((nv * wSelector.getValue()) / ov));
});
wSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
hSelector.getEditor().setText(String.valueOf((nv * hSelector.getValue()) / ov));
});
}
});
但这不能很好地工作。问题是,当选择lock
时,我更改了一个微调器的值,然后我只关注它们(通过单击微调器的文本字段)两个值,它们的值会自动更改,即使我没有编辑值。
现在,我的问题是,保持这些微调器的值比例的正确方法是什么?我的方法有什么问题?以及取消选择lock
后如何消除维持比率的行为。
答案 0 :(得分:3)
不要在每次切换按钮更改时添加新的侦听器。 “添加侦听器”是指该方法从字面上将侦听器添加到现有侦听器集中,因此在编写代码时,如果用户选择切换按钮十次,则每个微调器上将有十个侦听器。
正确的方法是向每个Spinner添加一个侦听器。如果未选择切换按钮,则每个侦听器都不应执行任何操作。您需要将微调框值的比率保留在私有字段中,以供听众使用。
private double ratio = 1;
// ...
lock.selectedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
hSelector.commitValue();
wSelector.commitValue();
ratio = (double) hSelector.getValue() / wSelector.getValue();
}
});
hSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
if (lock.isSelected()) {
wSelector.getValueFactory().setValue((int) (nv / ratio));
}
});
wSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
if (lock.isSelected()) {
hSelector.getValueFactory().setValue((int) (nv * ratio));
}
});
答案 1 :(得分:1)
您不想将监听器添加到selectedProperty
中。而是监听Spinner
值的更改。当值更改时,检查是否已选择lock
按钮并执行计算,然后:
hSelector.valueProperty().addListener((observable, oldValue, newValue) -> {
if (lock.isSelected()) {
wSelector.getValueFactory().setValue(newValue * wSelector.getValue() / oldValue);
}
});
wSelector.valueProperty().addListener((observable, oldValue, newValue) -> {
if (lock.isSelected()) {
hSelector.getValueFactory().setValue(newValue * hSelector.getValue() / oldValue);
}
});
但是,您可能需要检查用于确定新比率的公式,因为它似乎无法正常工作;数学不是我的强项。但这可以使您的微调器在更改值时正确更新。