gpt4 book ai didi

java - 如何专门化 JavaFX 的组件并隐藏其 API 以仅显示我的 API

转载 作者:行者123 更新时间:2023-12-01 20:14:22 25 4
gpt4 key购买 nike

正如标题中所说,我想专门使用我将多次重复使用的 TableView,该规范包含:

  • 显示的列
  • 根据默认重复过滤器和一些附加过滤器(基于 boolean 值或回调)过滤添加的内容。

我使用原始 FXML 文件和 Controller ,没有 UI 拖放构建。

为了尽可能简单地使用我的组件,我想隐藏 JavaFX 的组件部分并只允许我的方法,该怎么做?

最佳答案

创建一个扩展Control的类。将您希望用户访问的方法添加到此类中。

为此类创建皮肤并实现您不希望用户访问的行为。

好处:

  • 对用户隐藏实现细节。
  • 如有必要,允许用户替换“私有(private)”行为。
  • 允许您直接从节点访问“公共(public)”行为。

示例

控制

public class MyControl extends Control {

@Override
protected Skin<?> createDefaultSkin() {
return new MyControlSkin(this);
}

private final StringProperty text = new SimpleStringProperty();

public final String getText() {
return this.text.get();
}

public final void setText(String value) {
this.text.set(value);
}

public final StringProperty textProperty() {
return this.text;
}

}

皮肤

public class MyControlSkin extends SkinBase<MyControl> {

public MyControlSkin(MyControl control) {
super(control);

Text text = new Text();
text.textProperty().bind(control.textProperty());

getChildren().setAll(text);
}

}

使用

@Override
public void start(Stage primaryStage) {
final MyControl control = new MyControl();
Button btn = new Button("Say 'Hello World'");
btn.setOnAction((ActionEvent event) -> {
control.setText("Hello World!");
});

Scene scene = new Scene(new VBox(10, btn, control));

primaryStage.setScene(scene);
primaryStage.show();
}
<小时/>

请注意,如何创建 UI 并不重要。它可以直接从 java 创建或从 fxml 加载 - 这并不重要。你可以例如使用皮肤作为 fxml Controller 和根:

<fx:root type="javafx.scene.control.SkinBase" xmlns:fx="http://javafx.com/fxml">
<children>
<Text fx:id="text"/>
</children>
</fx:root>
@FXML
private Text text;

public MyControlSkin(MyControl control) throws IOException {
super(control);
getChildren().clear();

FXMLLoader loader = new FXMLLoader(someUrl);
loader.setRoot(this);
loader.setController(this);
loader.load();

text.textProperty().bind(control.textProperty());
}
<小时/>

顺便说一句:恕我直言,重复过滤最好放在单独的类中,例如 TransformationList。这样您就可以重用独立于 UI 的行为,从而更容易重用(例如与 ListView 一起使用)。

关于java - 如何专门化 JavaFX 的组件并隐藏其 API 以仅显示我的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46178294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com