因为这是有关设计的问题,所以我将先说一下我拥有和想要的东西。
我有
一个使用合成的设计。一个Cell
对象包含Shape
和一个Background
对象(此示例中为定制对象)。这2个中的每个都有定义它们的自己的数据。这是代码示例:
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中的更改:
我的问题 是,哪些类成员需要成为我绑定到的JavaFX属性。
这就是我的想法:“叶子”属性(大小,颜色,位置…)必须是属性,以便我可以将它们绑定到GUI属性。但是我是否也需要设置形状和背景对象属性?屏幕上只有它们的属性具有“
Actual”表示。理想情况下,如果Shape发生变化,那么它的所有属性都将告诉它们它们的绑定可能已经更改(也许颜色没有变化,但是尺寸却发生了变化)。但这并不是这样-
即使Shape的颜色可以在Shape改变时改变,Color属性也不能告诉它绑定的任何东西 。
使Cell成为具有许多单元格的较大图片中的属性等的方法也是如此:属性的属性委派更改。
因此,我想到了使Shape和Background也成为属性,InvalidationListener
并向其注册会更新其属性。这似乎不太对劲,因为我认为在对属性的所有支持下,将有一种方法可以做我想做的事情。
有人可以建议一种方法吗?
仅使用标准JavaFX
API,您就可以利用这些Bindings.selectXXX
方法来观察“属性”。
因此,例如:
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.paint.Color;
public class Cell {
private final ObjectProperty<Shape> shape = new SimpleObjectProperty<>(new Shape());
public final ObjectProperty<Shape> shapeProperty() {
return this.shape;
}
public final Cell.Shape getShape() {
return this.shapeProperty().get();
}
public final void setShape(final Cell.Shape shape) {
this.shapeProperty().set(shape);
}
public static class Shape {
private final IntegerProperty size = new SimpleIntegerProperty(0);
private final ObjectProperty<Color> color = new SimpleObjectProperty<>(Color.BLACK);
public final IntegerProperty sizeProperty() {
return this.size;
}
public final int getSize() {
return this.sizeProperty().get();
}
public final void setSize(final int size) {
this.sizeProperty().set(size);
}
public final ObjectProperty<Color> colorProperty() {
return this.color;
}
public final javafx.scene.paint.Color getColor() {
return this.colorProperty().get();
}
public final void setColor(final javafx.scene.paint.Color color) {
this.colorProperty().set(color);
}
}
public static void main(String[] args) {
Cell cell = new Cell();
Bindings.selectInteger(cell.shapeProperty(), "size").addListener(
(obs, oldSize, newSize) -> System.out.println("Size changed from "+oldSize+" to "+newSize));
cell.getShape().setSize(10);
cell.setShape(new Shape());
Shape s = new Shape();
s.setSize(20);
cell.setShape(s);
}
}
将产生(期望的)输出
Size changed from 0 to 10
Size changed from 10 to 0
Size changed from 0 to 20
该API有点旧感,因为它依赖于将属性名称作为字符串传递,因此不是类型安全的,并且不能在编译时进行检查。此外,如果任何中间属性为null(例如,cel.getShape()
在此示例中返回null),则绑定会生成烦人且冗长的警告消息(即使这被认为是受支持的用例)。
Tomas
Mikula在他的ReactFX库中有一个更现代的实现,请参阅此帖子以获取描述。使用ReactFX,您将执行以下操作:
public static void main(String[] args) {
Cell cell = new Cell();
Var<Number> size = Val.selectVar(cell.shapeProperty(), Shape::sizeProperty);
size.addListener(
(obs, oldSize, newSize) -> System.out.println("Size changed from "+oldSize+" to "+newSize));
cell.getShape().setSize(10);
cell.setShape(new Shape());
Shape s = new Shape();
s.setSize(20);
cell.setShape(s);
}
最后,如果要创建单元格列表,则可以创建一个ObservableList
指定的extractor
。提取器是将列表中的每个元素(每个Cell
)映射到Observable
s
数组的函数。如果这些Observable
更改中有任何更改,列表将触发更新事件。所以你可以做
ObservableList<Cell> cellList =
FXCollections.observableArrayList(cell -> new Observable[] {Bindings.selectInteger(cell.shapeProperty(), "size")});
使用标准API,或者
ObservableList<Cell> cellList =
FXCollections.observableArrayList(cell -> new Observable[] {Val.selectVar(cell.shapeProperty(), Shape::sizeProperty)});
使用ReactFX。然后,只需将a添加ListChangeListener
到列表中,大小会发生变化(或形状更改为其他大小的新形状)时,系统会通知它。您可以根据需要在返回数组中添加尽可能多的可观察对象,这些可观察对象是单元格的属性。
如果你的javascript语言基础还可以,应该明白类、基类、子类、父类等概念。如果你有这些类的概念,那么在学习Threejs的过程中,如何查找Threejs文档将会比较顺利。 点材质PointsMaterial、基础线材质LineBasicMaterial、基础网格材质MeshBasicMaterial、高光网格材质MeshPhongMaterial等材质都是父类Material的子类。 各种各
试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!
问题内容: 我正在借助以下方法设置新的React:https : //github.com/facebookincubator/create-react- app 但是,我遇到了一个棉绒问题。我收到以下掉毛错误。 这是导致问题的代码: 我试着使用react / prop-types规则,但无济于事。 问题答案: 根据这个问题发表评论。 这似乎是因为您在安装时仅应使用create-react- ap
我们在 field 对应的 Tag 中对 Column 的一些属性进行定义,定义的方法基本和我们写SQL定义表结构类似,比如: type User struct { Id int64 Name string `xorm:"varchar(25) notnull unique 'usr_name' comment('姓名')"` } 对于不同的数据库系统,数据类型其实
问题内容: 是HTML的属性吗? 我应该做还是 我读了很多文章,但仍然感到困惑。 有人可以向我解释一下HTML / JS中的属性与属性之间的区别是非常简单的吗? 问题答案: 属性由HTML定义。属性(在DOM元素上)由DOM(以及HTML 5定义,模糊了标记和DOM之间的边界)。 一些HTML属性具有1:1映射到属性。就是这样的一个例子。 有时名称是不同的。该属性映射到该属性,该属性映射到该属性(
我正在尝试使用DynamoDB JavaScript shell创建一个简单的表,我得到了这个异常: 下面是我试图创建的表: 但是,如果我将第二个属性添加到KeySchema,它就可以正常工作。a工作台下方: 我不想将范围添加到密钥架构。知道怎么修吗?