【问题标题】:Why does the below code give erros? This is java FX. The error says "double cannot be dereferenced"为什么下面的代码会出错?这是java FX。错误说“无法取消引用双精度”
【发布时间】:2018-03-18 07:07:57
【问题描述】:
    RadialGradient gradient1 = new RadialGradient(            
    0,    // focusAngle            
    .1,   // focusDistance            
    80,   // centerX            
    45,   // centerY            
    120,  // radius            
    false, // proportional            
    CycleMethod.REFLECT, // cycleMethod            
    new Stop(0, Color.YELLOW),               
    new Stop(1, Color.BLUE)    
    );


    Slider slider = new Slider(0, 100, 50);
    slider.setLayoutX(30);        
    slider.setLayoutY(90); 
    slider.setShowTickMarks(true);
    slider.setShowTickLabels(true);
    slider.setMajorTickUnit(100);
    slider.setMinorTickCount(20);
    slider.setBlockIncrement(5);

    **gradient1.getRadius().bind(slider.valueProperty());**

    root.getChildren().add(slider);    

星号之间的代码行给出错误。这段代码是 JavaFX 应用程序的一部分,我不知道为什么我不能将半径绑定到滑块值

【问题讨论】:

    标签: javafx javafx-8


    【解决方案1】:

    RadialGradient 是不可变的。即使不是你也需要使用属性进行绑定,而不是 value getter 方法,即gradient1.radiusProperty().bind(...

    您需要将整个 RadialGradient 对象绑定到使用它的属性:

    final Stop stop1 = new Stop(0, Color.YELLOW);
    final Stop stop2 = new Stop(1, Color.BLUE);
    
    ObjectBinding<RadialGradient> gradientBinding = Bindings.createObjectBinding(() -> new RadialGradient(            
        0,    // focusAngle            
        .1,   // focusDistance            
        80,   // centerX            
        45,   // centerY            
        slider.getValue(),  // radius            
        false, // proportional            
        CycleMethod.REFLECT, // cycleMethod            
        stop1,               
        stop2    
        ), slider.valueProperty());
    
    Rectangle rect = ...
    rect.fillProperty().bind(gradientBinding);
    

    【讨论】:

      【解决方案2】:

      gradient1.getRadius() 的返回类型为 double。

      double 在这种情况下不能被尊重,因为它是一个原始类型。

      您最有可能在该渐变中寻找 DoubleProperty 或其他东西。您需要使用变更侦听器找到解决方法。

      slider.valueProperty().addListener((x)->{/* modify gradient value here */})
      

      此外,直接的跨属性绑定在过去曾受到内存泄漏的影响。有一次,我求助于将我的一些项目中调用 .bind(**) 的所有内容修改为我之前描述过的内容。您应该检查是否仍需要解决方法。

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多