【发布时间】:2017-03-22 13:15:51
【问题描述】:
因为这是一个关于设计的问题,所以我会先说我拥有什么以及我想要什么。
我有一个使用组合的设计。 Cell 对象包含 Shape 和 Background 对象(此示例的自定义对象)。这两个都有自己的数据来定义它们。这是代码中的示例:
class Cell {
Shape shape;
Background background;
class Shape {
int size;
Color color;
Point location;
//...
}
class Background {
Color color;
String name;
CoverType type;
//...
}
}
我还有一个需要表示许多单元格的 GUI,并且我已经编写了如何操作(如何使用颜色、大小等在屏幕上创建我想要的内容)。它包括诸如 CellRepresentation、ShapeRepresentation 和 BackgroundRepresentation 之类的类,它们的显示属性绑定到数据属性(我认为这称为模型和视图)。
我希望能够通过更改上述数据来表示 GUI 中的变化:
- 用户可以(例如)右键单击形状并设置其颜色。所以上面的数据发生了变化,变化需要在GUI中体现出来。
- 用户还可以更改整个形状(例如从另一个单元格复制粘贴)。甚至整个细胞。这些更改也需要反映在 GUI 中。
我的问题是哪些类成员需要是我绑定到的 JavaFX 属性。
这就是我的想法:“叶子”属性(大小、颜色、位置...)必须是属性,因此我可以将 GUI 属性绑定到它们。但是我是否也需要制作形状和背景对象属性?只有它们的属性在屏幕上具有“实际”表示。理想情况下,我会喜欢它,如果 Shape 发生变化,那么它的所有属性都会告诉它们的绑定它们可能已经改变(也许颜色没有,但大小没有)。但它不能以这种方式工作 - 即使 Shape 的 Color 可以在 Shape 更改时更改,Color 属性也不会告诉绑定到它的任何内容它已更改。
在有许多单元格的较大图片中将 Cell 设置为属性也是如此:委托更改的属性的属性。
所以我想使 Shape 和 Background 也成为属性,并向它们注册 InvalidationListener 以更新它们的属性。这似乎不正确,因为我认为有了对属性的所有支持,就会有一种方法可以做我想做的事。
有人可以建议一种方法吗?
【问题讨论】:
-
@zyexal 我知道继承,java 对我来说并不陌生。这有什么关系?
-
您可能想看看
Bindings.selectXXX方法,它为您提供了一种绑定到“属性的属性”的方法。这个 API 有一种“遗留”的感觉,因为它不是类型安全的或编译时可验证的。 Tomas Mikula 有一个library,它对相同的想法进行了更现代的实现,请参阅this post。 -
最重要的是,您应该将 JavaFX 属性用于任何可能更改的内容,并且您可能希望对这些更改做出反应。 (所以可能你所有的领域......)。
标签: java javafx javafx-2 reactfx