如何创建完全自定义的JavaFX控件?或者:如何使用动态绘制的背景创建窗格?

时间:2017-05-05 15:24:53

标签: java swing javafx

我想创建完全自定义的JavaFX控件。我不想“喜欢作曲”,因为我没有东西可以写作。

例如,假设我需要一个窗格,里面有坐标网格。窗格应该像普通窗格一样工作,即应该可以在那里添加控件或几何图形,但是在窗格的背景中应该绘制网格。另外,应在窗格的边缘绘制数值。

所有这些都应该动态反映窗格的转换和视口。

另一个例子:假设我想将平铺图像作为beckground。有数百万的瓷砖,比如谷歌地图,所以我无法将它们作为子节点加载,因为它们会耗尽内存。当用户滚动窗格时,我需要动态加载和卸载它们。

同样,窗格应该像普通窗格一样运行,即可以将子窗口添加到窗格中。

如何做到这一点?我发现,与paintConponent类似的低级方法要么不存在,要么弃用。那么,该怎么办?

更新

我想设计一个具有自定义背景的容器。

例如,像这样:

enter image description here

(它应该是无穷无尽的,即一旦控件调整大小就显示更多行)

默认情况下,容器应该没有子节点,但仍然具有背景。背景不应该是容器的子代。我,程序员,应该能够将子容器添加到此容器中,并且只有在此之后,子容器才会出现在容器中。它们应该出现在背景之上。

像这样:

enter image description here

请注意,我们这里只有2个孩子。

更新

在下面的代码ScrollBar中显示标准控件。如您所见,它包含可以移动的旋钮和可以按下的箭头按钮。

同时,此控件中的子项数报告为零。

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中那样画画,那就让我们来做作曲。但是如何从用户那里隐藏这个组合,因为它是ScrollBar控制的?

0 个答案:

没有答案