javafx中的低级绑定(使用computeValue)

时间:2014-03-18 07:21:33

标签: java javafx

我是javafx的初学者。 我想将垂直滑块绑定到矩形高度。 我想使用低级绑定。但它没有做任何事情。 请帮我 。感谢' S

   rect = (Rectangle) root.lookup("#rect");
   vSlider = (Slider) root.lookup("#vSlider");
     final RectangleProperty rectangle = new RectangleProperty(rect);

   DoubleBinding vSliderBind = new DoubleBinding() {
         {
             super.bind(vSlider.valueProperty(),rectangle.heightpProperty());
         }

        @Override
        protected double computeValue() {
            rectangle.setHeightp(vSlider.valueProperty().doubleValue()*3);
           // System.out.print("vslider");
            return rectangle.getHeightp() ;
        }
    };
   vSliderBind.get()

1 个答案:

答案 0 :(得分:3)

为什么要尝试使用低级绑定?低级绑定的本质(正如你所说)是执行复杂的计算,这是流畅的API无法实现的。要将height绑定到滑块的value,只需一条简单的行就可以了:

r.heightProperty().bind(slider.valueProperty());

即使您想要简单的操作(例如,将其乘以某个东西,也可以是常量或其他属性):

r.heightProperty().bind(slider.valueProperty().multiply(0.5));

以下是完成代码的完整代码:

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RectHeightSlider extends Application
{
    @Override
    public void start(Stage primaryStage) {
        AnchorPane root = new AnchorPane();

        Slider slider = new Slider();
        slider.setMin(10);
        slider.setMax(100);
        slider.setValue(50);
        slider.setOrientation(Orientation.VERTICAL);

        root.getChildren().add(slider);

        Rectangle r = new Rectangle();
        r.setWidth(100);
        r.heightProperty().bind(slider.valueProperty());
        root.getChildren().add(r);
        AnchorPane.setRightAnchor(r, 0.0);

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

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

修改

如果你 做低级别的话,那就做:

DoubleBinding vSliderBind = new DoubleBinding() {
    {
        super.bind(vSlider.valueProperty());
    }

    @Override
    protected double computeValue() {
        return vSlider.getValue();
    }
};

rectangle.heightProperty().bind(vSliderBind);

原因是:

  • 使用super.bind()将侦听器设置为绑定所依赖的属性。此绑定取决于滑块的值,计算矩形的高度;因此,你必须bind()只有滑块的值。
  • 使用computeValue(),如下所示:只要一个或多个绑定属性发生变化,就可以计算实际输出值(此处:rect的高度)。这里的计算是一个简单的身份(f(x)= x),在其他情况下,它可能更复杂。

另一种方法是在value属性中添加一个监听器,然后手动更新高度。