【发布时间】:2017-05-05 15:24:53
【问题描述】:
我想创建完全自定义的 JavaFX 控件。我不想“更喜欢作曲”,因为我没有东西要作曲。
例如,假设我需要一个窗格,里面有坐标网格。窗格应该像普通窗格一样工作,即应该可以在那里添加控件或几何图形,但在窗格的背景应该绘制一个网格。此外,数值应绘制在窗格的边缘。
所有这些都应该动态反映窗格的变换和视口。
另一个例子:假设我想将平铺图像作为背景。有数百万个图块,就像在谷歌地图中一样,所以我不能将它们作为子节点加载,因为它们会耗尽内存。我需要在用户滚动窗格时动态加载和卸载它们。
同样,窗格应该像普通窗格一样工作,即可以将子级添加到其中。
如何做到这一点?我发现,类似于paintConponent 的低级方法要么不存在,要么已弃用。那么,该怎么办呢?
更新
我想设计一个具有自定义背景的 CONTAINER。
例如,像这样:
(它应该是无止境的,即一旦控件调整大小显示更多行)
默认情况下容器应该没有孩子,但仍然有背景。背景不应是容器的子级。我,程序员,应该能够将孩子添加到这个容器中,只有在那之后,孩子才会出现在容器中。它们应该出现在背景之上。
像这样:
请注意,我们这里只有 2 个孩子。
更新
在ScrollBarstandard 控制下方的代码中显示。如您所见,它包含可移动的旋钮和可按下的箭头按钮。
同时,该控件中的子节点数报告为零。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class ChildrenOfDefaultControls extends Application {
@Override
public void start(Stage primaryStage) throws Exception
{
ScrollBar scrollBar = new ScrollBar();
AnchorPane root = new AnchorPane(scrollBar);
AnchorPane.setLeftAnchor(scrollBar, 0.);
AnchorPane.setRightAnchor(scrollBar, 0.);
AnchorPane.setTopAnchor(scrollBar, 100.);
Scene scene = new Scene(root, 800, 600);
primaryStage.setTitle(String.valueOf(scrollBar.getChildrenUnmodifiable().size()));
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(ChildrenOfDefaultControls.class, args);
}
}
好吧,我同意如果每个人都说不可能像 Swing 那样画画,那么让我们来作曲吧。但是如何像 ScrollBarcontrol 那样对用户隐藏这个组合?
【问题讨论】:
-
layoutChildren()听起来像是不正确的东西?......就像一些黑客...... -
Skin也听起来不合适,因为它可以根据定义进行更改。我希望控件永远具有计算背景。 -
我在 Skin 和 SkinBase 中都没有看到任何绘图方法。绘制代码放在哪里?
-
线条和瓦片都应该在底层绘制,它们不应该是节点
-
这意味着我不能有真正的自定义控件,只有可以组合它们的砖块......