这更像是一个理论问题,而不是一个实际的编码问题(我应该能够解决问题的这一部分)。
我有三个滑块( S1,S2,S3 )。每个滑块的 min值为0 ,最大值为35 (两者之间的每个值都是 int )。 这三个滑块的总和不能超过50.它当然可以是< = 50且> = 0,但是从不< = 0.
例如,如果初始值S1 = 20,S2 = 11,S3 = 3.如何连接这些滑块,以便如果我将S3从值3更改为值23,则其他滑块应该更改它们的值,使其始终在0到50之间。或者,如果我将S1从20更改为50,则S2和S3都应移至0.
现在我的伪代码看起来像这样(这是我们改变滑块S1的情况,但我觉得很多都没有了。)
double newValue1 = 0;
double newValue2 = 0;
if( (S1 + S2 + S3) > maxAntalRum ) {
diff = max - (S1 + S2 + S3); // the diff if tot value of S1-S3 exceeds 50
newValue1 = floor(diff/2); // new values are divided upon the 2 sliders that we are not changing (i.e. S2 and S3). Value rounded off up.
newValue2 = ceil(diff/2); // Value rounded off down.
S2 += newValue1;
S3 += newValue2;
sliderS2.setValue(S2);
sliderS3.setValue(S3);
我有点卡住了。我该如何处理这个问题?或者我应该从哪个角度处理它?</ p>
此致
安娜
答案 0 :(得分:1)
我认为你已经得到了它。当然,您需要为每个滑块提供类似的代码。此外,您还需要检查您是否尚未调整滑块。 (如果你只有两个滑块,你可以通过检查滑块值是否已经正确来跳过这个,但有三个你一次改变两个,并且短时间内数字会赢得&#39;加起来。)所以你想要这样的东西:
private boolean gate = true; // Instance field.
在方法中:
if (gate) {
gate = false;
...
// Your code here.
...
gate = true;
}
答案 1 :(得分:-1)
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.GridPane;
public class Sliders extends GridPane {
private static final int MINIMUM = 0;
private static final int MAXIMUM = 100;
private ScrollBar scrollBar1;
private ScrollBar scrollBar2;
private ScrollBar scrollBar3;
private boolean canUpdate = true;
public Sliders() {
scrollBar1 = getTrainingScrollBar(MAXIMUM, (oldValue, newValue) -> handleSliderChange(oldValue, newValue, scrollBar2, scrollBar3));
scrollBar2 = getTrainingScrollBar(MINIMUM, (oldValue, newValue) -> handleSliderChange(oldValue, newValue, scrollBar1, scrollBar3));
scrollBar3 = getTrainingScrollBar(MINIMUM, (oldValue, newValue) -> handleSliderChange(oldValue, newValue, scrollBar1, scrollBar2));
this.add(scrollBar1, 0, 0);
this.add(scrollBar2, 0, 1);
this.add(scrollBar3, 0, 2);
}
private ScrollBar getTrainingScrollBar(int defaultValue, ScrollBarHandler handler) {
ScrollBar scrollBar = new ScrollBar();
scrollBar.setMin(MINIMUM);
scrollBar.setMax(MAXIMUM);
scrollBar.setPrefSize(300, 40);
scrollBar.setValue(defaultValue);
scrollBar.valueProperty().addListener((observable, oldValue, newValue) -> handler.handle(oldValue, newValue));
return scrollBar;
}
private void handleSliderChange(Number oldValue, Number newValue, ScrollBar sb1, ScrollBar sb2) {
if (canUpdate) {
canUpdate = false;
double value = newValue.doubleValue() - oldValue.doubleValue();
if (isEqualToZero(value)) {
canUpdate = true;
return;
}
value = value / 2;
if (setValueAndCheckIfSliderReachZero(sb1, sb2, value)) {
return;
}
if (setValueAndCheckIfSliderReachZero(sb2, sb1, value)) {
return;
}
sb1.setValue(sb1.getValue() - value);
sb2.setValue(sb2.getValue() - value);
canUpdate = true;
}
}
private boolean setValueAndCheckIfSliderReachZero(ScrollBar scrollbar1, ScrollBar scrollbar2, double value) {
double nextValue = scrollbar1.getValue() - value;
if (nextValue <= 0d) {
scrollbar1.setValue(0d);
scrollbar2.setValue(scrollbar2.getValue() - value + nextValue);
canUpdate = true;
return true;
}
return false;
}
public static boolean isEqualToZero(Double number) {
return Math.abs(number) < 0.00000001;
}
@FunctionalInterface
private interface ScrollBarHandler {
void handle(Number oldValue, Number newValue);
}
}