Como criar um controle JavaFX totalmente personalizado? Ou: como criar o painel com plano de fundo desenhado dinamicamente?

Gostaria de criar um controle JavaFX totalmente personalizado. Não quero "preferir composição", porque não tenho coisas para compor.

Por exemplo, suponha que eu precise de um painel com grade de coordenadas dentro. O painel deve funcionar como o painel normal, ou seja, deve ser possível adicionar controles ou fugas geométricas, mas no backgroud do painel, uma grade deve ser desenhada. Além disso, os valores numéricos devem ser desenhados na borda do painel.

Tudo isso deve refletir dinamicamente a transformação e a janela de exibição do painel.

Outro exemplo: suponha que eu queira ter uma imagem lado a lado como fundo. Existem milhões de blocos, como no google maps, então não posso carregá-los como nós filhos, porque eles esgotarão a memória. Eu preciso que eles sejam carregados e descarregados dinamicamente enquanto o usuário rola o painel.

Novamente, o painel deve se comportar como painel normal, ou seja, podem ser adicionados childs a ele.

Como conseguir isso? Estou descobrindo que métodos de baixo nível semelhantes apaintConponent estão ausentes ou estão obsoletos. Então o que fazer?

ATUALIZAR

Quero projetar um recipiente com fundo personalizado.

Por exemplo, assim:

(deve ser interminável, ou seja, mostrar mais linhas quando o controle for redimensionado)

O contêiner não deve ter filhos por padrão, mas ainda possui o plano de fundo. O plano de fundo não deve ser filho de um contêiner. Eu, programador, devo poder adicionar filhos a esse contêiner e somente depois disso os filhos devem aparecer no contêiner. Eles devem aparecer acima do plano de fundo.

Como isso:

Note que temos apenas 2 filhos aqui.

ATUALIZAR

No código abaixoScrollBarcontrole padrão é exibido. Como você pode ver, ele contém o botão giratório, que pode ser movido, e os botões de seta, que podem ser pressionados.

Simultaneamente, o número de filhos nesse controle é relatado como zero.

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);
   }
}

Ok, eu concordo que todo mundo diga que é impossível desenhar como no Swing, vamos fazer composição. Mas como esconder essa composição do usuário, como ela fezScrollBarao controle?

questionAnswers(1)

yourAnswerToTheQuestion