Dodanie własnej kontrolki w Java FX Scene Builder 2.0

Dodanie własnej kontrolki w Java FX Scene Builder 2.0
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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ł

edytowany 1x, ostatnio: MichTar
99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
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


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 1x, ostatnio: 99xmarcin
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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.

edytowany 1x, ostatnio: MichTar
99xmarcin
Podaj kod kontrolki, może brak public na klasie lub public parameter-less ctora. SceneBuilder ma dość długą listę wymagań którą trzeba spełnić.
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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ć:

Kopiuj
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
    }
}
99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
0

screenshot-20210608140535.png

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


Holy sh*t, with every month serenityos.org gets better & better...
99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
1

screenshot-20210608141043.png

Kopiuj
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
    }
}

Holy sh*t, with every month serenityos.org gets better & better...
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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?

Zobacz pozostałe 2 komentarze
99xmarcin
Oprócz wersji JDK musi się jeszcze wersja javafx zgadzać z tą której używa SceneBuilder. To może być to. Co do installacji to Google lub pytaj na forum.
MT
Wskazałem w opcjach NetBeans odpowiednią ścieżkę do zainstalowanego SceneBuilder 8.5.0 i dalej to samo. Próbowałem też na innej kontrolce. Przy dodawaniu kontrolki okno "Import dialog" jest puste (może dlatego, że nie ma fxml?), natomiast w oknie "Library Manager" kontrolka jest na liście jako zainstalowana, przy czym dalej jest wykrzyknik przy niej i komunikat "Unresolved class CustomControlClass". Po kliknięciu na nią w zakładce "Hierarchy", w zakładkach po prawej stronie (Properties, Layout and Code) jest też błąd: "Selection contains unresolved reference".
99xmarcin
Spróbuj to zreprodukować dokładnie na tej jednej klasie która u mnie działa. I sprawdź to co pisałem, czyli wersja SceneBuilder'a musi być zgodna z wersją Javay i Java FX. Spróbuj czy dasz radę zimportować kontrolki z mojego starego projektu: https://github.com/marcin-chwedczuk/xox Tutaj mam nowszy projekt na JDK 14: https://github.com/marcin-chwedczuk/rfid/tree/master/app kontrolki się importują, radzę sprawdzić u siebie. Problemem może być Java 8 i zbyt nowa wersja SceneBuildera. Radzę skoczyć na JDK 11, to jest teraz LTS, Java 8 powinna już powoli odchodzić w zapomnien
99xmarcin
...nie.
99xmarcin
Generalnie dam Ci taką radę z 7 lat doświadczenia, musisz wyizolować problem. Zrób pusty projekt z tą jedną kontrolką i na tym testuj.
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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ę:
Kopiuj
<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".

edytowany 1x, ostatnio: MichTar
Zobacz pozostały 1 komentarz
MT
Wrzuciłem ten projekcik do zip-a na: https://github.com/MichaTar/java-test Tym razem jak robię analizę jar-a to mam błąd przy ładowaniu "unknown path" i nie wiem w sumie co powinienem wpisać w imporcie w fxml jeśli wszystkie pliki są w "default package".
99xmarcin
Meh to Netbeans, mogę pomóc ale jak bedziesz miał projekt jako Maven/Gradle. W NetBeans nie chce mi się bawić, a domyślam się że chodzi o zależność lub wersję JDK
MT
99xmarcin
Nie mogę Ci pomóc bo widzę że używasz jakichś staroci, przejdź jak człowiek na JDK 11 + Maven/Gradle build (tak żeby generować JAR z command line'u) to możemy porozmawiać. Setup JavaFX na JDK8 to prawdziwy ból w du*e.
MT
Niestety mój projekt został już napisany wcześniej w Java 8 i przejście na nowsze JDK mogło by być problemem.
MT
  • Rejestracja:około 4 lata
  • Ostatnio:9 miesięcy
  • Postów:21
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.