将三个滑块相互连接

时间:2013-11-20 17:23:14

标签: java user-controls slider

这更像是一个理论问题,而不是一个实际的编码问题(我应该能够解决问题的这一部分)。

我有三个滑块( 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>

此致

安娜

2 个答案:

答案 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);
    }
}