当前位置: 首页 > 知识库问答 >
问题:

实现链接属性的JavaFX

慕意致
2023-03-14

这在传统的Java bean(set/get方法)中很简单,但是JavaFX属性包含了可观察的概念和绑定,而且似乎很快就变得复杂起来。

我尝试过绑定,但这使得目标属性不可设置,也尝试过双向绑定,但我只能绑定“相等”,而不能绑定表达式

我已经开始将range实现为javafx.beans.property.IntegerProperty,但是处理监听器等似乎需要大量工作。

private int lower = 0;
private int upper = 0;

public int getLower() {
    return lower;
}
public void setLower(int lower) {
    this.lower = lower;
}

public int getUpper() {
    return upper;
}
public void setUpper(int upper) {
    this.upper = upper;
}

public int getRange() {
    return upper - lower;
}
public void setRange(int range) {
    upper = lower + range;
}

我将如何用JavaFX的方式来实现这一点?这是我试过的

IntegerProperty lower = new SimpleIntegerProperty(this, "lower", 0);
IntegerProperty upper = new SimpleIntegerProperty(this, "upper", 0);
IntegerProperty range = new SimpleIntegerProperty(this, "range", 0);

public LinkedPropTest() { // Constructor
    lower.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
        range.setValue(upper.getValue() - lower.getValue());
    });
    upper.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
        range.setValue(upper.getValue() - lower.getValue());
    });
    range.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
        upper.setValue(range.getValue() + lower.getValue());
    });
}

我认为这是可行的,但我必须定义一个“虚拟”属性,而且(我认为)添加ChangeListeners会破坏使用惰性计算的机会。

共有1个答案

于飞飙
2023-03-14

好的,我们需要:

  • 两个默认的IntegerProperty对象为SimpleIntegerProperty
  • 和一个从IntegerPropertyBase派生的自定义IntegerProperty,以根据您的需要实现某些特殊行为。

所以我们有您的属性作为会员:

private final IntegerProperty lower = new SimpleIntegerProperty(0);
private final IntegerProperty upper = new SimpleIntegerProperty(0);
private final IntegerProperty range = new IntegerPropertyBase() {

    {
        upper.addListener(obs -> update());
        lower.addListener(obs -> update());
    }

    @Override
    public String getName() {
        return "range";
    }

    @Override
    public Object getBean() {
        return Main.this;
    }

    private void update() {
        super.set(upper.get() - lower.get());
    }

    @Override
    public void set(int newValue) {
        upper.set(lower.get() + newValue);
    }

};
private void printStats() {
    System.out.println("lower : " + lower.get() + " - upper: "
            + upper.get() + " - range: " + range.get());
    System.out.println();
}

@Override
public void start(Stage primaryStage) {

    lower.addListener(obs -> {System.out.println("Lower changed"); printStats();});
    upper.addListener(obs -> {System.out.println("Upper changed"); printStats();});
    range.addListener(obs -> {System.out.println("Range changed"); printStats();});

    System.out.println(" ######### TEST #1 #############");
    lower.set(5);

    System.out.println(" ######### TEST #2 #############");
    upper.set(5);

    System.out.println(" ######### TEST #3 #############");
    range.set(10);
}
 类似资料:
  • 因此,我想做的是在运行时使用 类创建一个类型。我希望从中实现运行时类型的接口如下所示。 应生成的类型应如下所示: 接口的显式实现并不是真正必要的,但这是我找到的最多的资源。 作为代码的简短解释。 创建DynamicAssembly/模块/类 创建备份字段和属性本身 为属性创建Get方法的内容 将属性标记为接口的实现 创建新类型 但是,方法向我抛出以下内容: 方法实现中的正文和声明的签名不匹配。类型

  • 问题内容: href="http://google.com" rel="external"> LINK 问题答案: Felix Kling和三十点建议使用属性选择器()。 但这 仅在是 唯一 值 时才有效 。 如果要设置可能具有1个或多个值的链接的样式,则应使用属性选择器: (注意波浪号字符) 这样的链接的示例可能是:

  • 链接计算属性用于与单个属性下的一个或多个预定义计算属性聚合。 语法 (Syntax) var ClassName = Ember.Object.extend ({ NameOfComputedProperty1: Ember.computed(function() { return VariableName; }), NameOfComputedProperty2:

  • 为什么验证器(http://validator.w3.org/)拒绝这个?什么属性是我不知道的“必需”? 错误: 错误行408,第142列:元素链接缺少必需的属性/模块/14ce1e21/peadig eucookie。css'type='text/css'media='all'/

  • 本文向大家介绍C#自动实现的属性,包括了C#自动实现的属性的使用技巧和注意事项,需要的朋友参考一下 示例 自动实现的属性在C#3中引入。 自动实现的属性用空的getter和setter(访问器)声明: 当在代码中写入自动实现的属性时,编译器会创建一个私有的匿名字段,该字段只能通过属性的访问器进行访问。 上面的自动实现的属性语句等效于编写以下冗长的代码: 自动实现的属性的访问器中不能包含任何逻辑,例