Dodanie własnej kontrolki w Java FX Scene Builder 2.0

0

Witam,

Jestem początkującym użytkownikiem Java FX i chciałbym dodać do TabPane własną kontrolkę jako extends dla LineChart. Po utworzeniu klasy własnej kontrolki z extends LineChart dodałem do pliku .fxml dla TabPane odpowiedni import dla nowej kontrolki (w pliku fxml nie ma żadnych błędów). Po otwarciu .fxml dla TabPane w Scene Builder 2.0 mam komunikat "Unresolved class MyCustomControl" i nie mogę dodać tej kontrolki do GUI. Robiłem też próby z ustawianiem scenebuilder-classpath-element, ale nic to nie dało, a poza tym to wyrażenie nie jest chyba wspierane w Scene Builder 2.0 ( https://bugs.openjdk.java.net/browse/JDK-8094986 ).
Ponieważ jestem początkującym użytkownikiem, więc może robię jakiś podstawowy błąd - nie wiem np., czy jeśli robię extends istniejącej kontrolki, to muszę też utworzyć własny plik .fxml dla niej, a jeśli tak, to z jaką zawartością? Dodam, że nie potrzebuję robić żadnych zmian w GUI własnej kontrolki a jedynie w jej kodzie.

Pozdrawiam
Michał

0

Wklej cały log który masz stąd:
screenshot-20210608113751.png

Najlepiej przed pobraniem logu, przebudować całą aplikację (np. mvn clean package).

Być może ugryzł Ciebie ten błąd: https://github.com/marcin-chwedczuk/rfid/blob/master/app/gui/src/main/java/pl/marcinchwedczuk/rfid/gui/KeyBox.java#L34

0

@0xmarcin: Przebudowałem projekt i z analizy JAR mam pusty log. Znalazłem natomiast opis identycznego problemu, jaki jest u mnie: https://jaxenter.com/netbeans/making-custom-javafx-controls-available-in-the-scene-builder
Wygenerowałem .jar z klasy mojej kontrolki, jednak po wybraniu go, w oknie importu JAR/FXML nie mam żadnego elementu do zaimportowania.
Podany przez Ciebie błąd u mnie nie występuje.

0

@MichTar: Być może mam błędny konstruktor public bez parametrów, bo wywołuję this z wartościami null. Nie wiem w sumie jak to powinno wyglądać:

package com.visualization;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.layout.VBox;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.PathElement;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.beans.NamedArg;

public class LineChartWithGaps<X, Y> extends LineChart<X, Y> {

    List<Integer> gapIndexes;

	public LineChartWithGaps() {
		this(null, null, null);
	}
	
    public LineChartWithGaps(@NamedArg("xAxis") Axis<X> xAxis, @NamedArg("yAxis") Axis<Y> yAxis, List<Integer> gapIndexes) {
        super(xAxis, yAxis);
        this.gapIndexes = gapIndexes;
    }

    @Override
    protected void layoutPlotChildren() {
        super.layoutPlotChildren();
        updatePath();
        updateDataPoints();
    }

    private void updatePath() {
        //TODO
    }

    private void updateDataPoints() {
        //TODO
    }
}
0

screenshot-20210608140535.png

Ja mam w logu ładny błąd dla twojej kontrolki

1

screenshot-20210608141043.png

package pl.marcinchwedczuk.rfid.gui;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.layout.VBox;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.PathElement;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.beans.NamedArg;

public class LineChartWithGaps extends LineChart<Number, Number> {

    List<Integer> gapIndexes;

    public LineChartWithGaps() {
        this(new NumberAxis(), new NumberAxis(), null);
    }

    public LineChartWithGaps(@NamedArg("xAxis") Axis<Number> xAxis,
                             @NamedArg("yAxis") Axis<Number> yAxis,
                             List<Integer> gapIndexes) {
        super(xAxis, yAxis);
        this.gapIndexes = gapIndexes;
    }

    @Override
    protected void layoutPlotChildren() {
        super.layoutPlotChildren();
        updatePath();
        updateDataPoints();
    }

    private void updatePath() {
        //TODO
    }

    private void updateDataPoints() {
        //TODO
    }
}
0

@0xmarcin: Dzięki za poprawkę w kodzie. Jednak dalej po wskazaniu jar-a przy imporcie JAR/FXML w Scene Builder nie pojawia mi się kontrolka do wyboru. Widzę też, że w menu kontrolek w Scene Builder nie ma w rozwijanym menu pozycji Custom, ale to może dlatego, że nie mam żadnej własnej kontrolki?

0

Rzeczywiście najlepiej pewnie będzie popróbować na oddzielnym projekcie.
Chciałbym jeszcze się upewnić, czy robię wszystko dobrze podczas dodawania tej kontrolki:

  1. W pliku fxml dla TabPane dodaję import do folderu, w którym jest klasa kontrolki oraz dodaję jako odpowiedni children kontrolkę:
<LineChartWithGaps fx:id="GapsChart" VBox.vgrow="ALWAYS"/>

W pliku fxml nie mam żadnych błędów (klasa kontrolki jest widoczna).
2. Generuję plik .jar z pliku .java kontrolki i importuję go w Scene Builder. Po wybraniu pliku .jar okno "Import Dialog" jest puste:
screenshot-20210610102319.png

Klikam na "Import Jar (no UI components)" i kontrolka znajduję się na liście zainstalowanych kontrolek:
screenshot-20210610102639.png

W Menu kontrolek nie pojawia się pozycja Custom:
screenshot-20210610103050.png

Przy kontrolce jest ikonka wykrzyknika screenshot-20210610103359.png i komunikat "Unresolved class LineChartWithGaps".

0

Z racji tego, że nie potrzebuję robić żadnych modyfikacji w GUI własnej kontrolki, dodałem ją tylko do fxml ustawiając niezbędne parametry w kodzie, bez korzystania ze Scene Builder'a.

1 użytkowników online, w tym zalogowanych: 0, gości: 1