Всем доброе утро, день или вечер! Новичок нуждается в помощи, ибо очень тупит. Решил создать приложение подруге на JavaFX через Idea. При этом использовал JDK 18 и JavaFX 19. При создании приложения все отлично получалось, запускается через RUN. В итоге сделал jar файл импортировав в артефакт. У меня Jar файл запускается без проблем, но при попытке запуска на MacOs подруги в терминале высвечивается данная ошибка.
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @22de69b2'
Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
 at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
 at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:253)
 at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:266)
 at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
 at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
 at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
 at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:679)
 at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
 at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
 at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
 at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
 ... 1 more
Exception in thread "main" java.lang.RuntimeException: No toolkit found
 at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:278)
 at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
 at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
 at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
 at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:679)
 at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
 at java.base/java.lang.Thread.run(Thread.java:833)
Вот само приложение: HelloApplication
package com.example.dasha;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 320, 240);
        stage.setTitle("Ortodont1");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}
HelloController
package com.example.dasha;


import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;

public class HelloController {

    @FXML
    private ResourceBundle resources;


    @FXML
    private Button Calc;

    @FXML
    private Text DownDif10;

    @FXML
    private TextField Example1;

    @FXML
    private Text DownDif11;

    @FXML
    private Text DownDif12;

    @FXML
    private Text DownDif7;

    @FXML
    private Text DownDif8;

    @FXML
    private Text DownDif9;

    @FXML
    private TextField DownLength10;

    @FXML
    private TextField DownLength11;

    @FXML
    private TextField DownLength12;

    @FXML
    private TextField DownLength7;

    @FXML
    private TextField DownLength8;

    @FXML
    private TextField DownLength9;

    @FXML
    private TextField DownT31;

    @FXML
    private TextField DownT32;

    @FXML
    private TextField DownT33;

    @FXML
    private TextField DownT34;

    @FXML
    private TextField DownT35;

    @FXML
    private TextField DownT36;

    @FXML
    private TextField DownT41;

    @FXML
    private TextField DownT42;

    @FXML
    private TextField DownT43;

    @FXML
    private TextField DownT44;

    @FXML
    private TextField DownT45;

    @FXML
    private TextField DownT46;

    @FXML
    private Text UpDif1;

    @FXML
    private Text UpDif2;

    @FXML
    private Text UpDif3;

    @FXML
    private Text UpDif4;

    @FXML
    private Text UpDif5;

    @FXML
    private Text UpDif6;
    @FXML
    private Text NumberOfBolton;

    @FXML
    private Text NumberOfTon;

    @FXML
    private TextField TextOfBolton;

    @FXML
    private TextField TextOfTon;

    @FXML
    private TextField PonDown1;

    @FXML
    private TextField PonDown2;

    @FXML
    private TextField PonUp1;

    @FXML
    private TextField PonUp2;

    @FXML
    private TextField PonVivodDown1;

    @FXML
    private TextField PonVivodDown2;

    @FXML
    private TextField PonVivodUp1;

    @FXML
    private TextField PonVivodUp2;

    @FXML
    private Text PonNormaNiz;

    @FXML
    private Text PonNormaUp;

    @FXML
    private TextField KorkHauzDown;

    @FXML
    private TextField KorkHauzUp;

    @FXML
    private TextField KorkhauzVivodDown;

    @FXML
    private TextField KorkhauzVivodUp;


    @FXML
    private TextField UpLength1;

    @FXML
    private TextField UpLength2;

    @FXML
    private TextField UpLength3;

    @FXML
    private TextField UpLength4;

    @FXML
    private TextField UpLength5;

    @FXML
    private TextField UpLength6;

    @FXML
    private TextField UpT11;

    @FXML
    private TextField UpT12;

    @FXML
    private TextField UpT13;

    @FXML
    private TextField UpT14;

    @FXML
    private TextField UpT15;

    @FXML
    private TextField UpT16;

    @FXML
    private TextField UpT21;

    @FXML
    private TextField UpT22;

    @FXML
    private TextField UpT23;

    @FXML
    private TextField UpT24;

    @FXML
    private TextField UpT25;

    @FXML
    private TextField UpT26;

    @FXML
    private TextField WidthBack;

    @FXML
    private TextField WidthFront;

    @FXML
    void initialize() {
        Calc.setOnAction(event ->{
            //Получение числового значения длины одного зуба для 1 ряда
            Float T11 = Float.parseFloat(UpT11.getText());
            Float T12 = Float.parseFloat(UpT12.getText());
            Float T13 = Float.parseFloat(UpT13.getText());
            Float T14 = Float.parseFloat(UpT14.getText());
            Float T15 = Float.parseFloat(UpT15.getText());
            Float T16 = Float.parseFloat(UpT16.getText());
            //Получение числового значения длины одного зуба для 2 ряда
            Float T21 = Float.parseFloat(UpT21.getText());
            Float T22 = Float.parseFloat(UpT22.getText());
            Float T23 = Float.parseFloat(UpT23.getText());
            Float T24 = Float.parseFloat(UpT24.getText());
            Float T25 = Float.parseFloat(UpT25.getText());
            Float T26 = Float.parseFloat(UpT26.getText());
            //Получение числового значения длины одного зуба для 3 ряда
            Float T31 = Float.parseFloat(DownT31.getText());
            Float T32 = Float.parseFloat(DownT32.getText());
            Float T33 = Float.parseFloat(DownT33.getText());
            Float T34 = Float.parseFloat(DownT34.getText());
            Float T35 = Float.parseFloat(DownT35.getText());
            Float T36 = Float.parseFloat(DownT36.getText());
            //Получение числового значения длины одного зуба для 4 ряда
            Float T41 = Float.parseFloat(DownT41.getText());
            Float T42 = Float.parseFloat(DownT42.getText());
            Float T43 = Float.parseFloat(DownT43.getText());
            Float T44 = Float.parseFloat(DownT44.getText());
            Float T45 = Float.parseFloat(DownT45.getText());
            Float T46 = Float.parseFloat(DownT46.getText());


            //Получение длин пар для 1 ряда (Сложение введеных данных)
            Float Pair1 = T16 + T15;
            Float Pair2 = T14 + T13;
            Float Pair3 = T12 + T11;
            //Получение длин пар для 2 ряда (Сложение введеных данных)
            Float Pair4 = T21 + T22;
            Float Pair5 = T23 + T24;
            Float Pair6 = T25 + T26;
            //Получение длин пар для 3 ряда (Сложение введеных данных)
            Float Pair7 = T36 + T35;
            Float Pair8 = T34 + T33;
            Float Pair9 = T32 + T31;
            //Получение длин пар для 4 ряда (Сложение введеных данных)
            Float Pair10 = T41 + T42;
            Float Pair11 = T43 + T44;
            Float Pair12 = T45 + T46;


            //Получение наличия для 1 ряда
            Float Nalichie1 = Float.parseFloat(UpLength1.getText());
            Float Nalichie2 = Float.parseFloat(UpLength2.getText());
            Float Nalichie3 = Float.parseFloat(UpLength3.getText());
            //Получение наличия для 2 ряда
            Float Nalichie4 = Float.parseFloat(UpLength4.getText());
            Float Nalichie5 = Float.parseFloat(UpLength5.getText());
            Float Nalichie6 = Float.parseFloat(UpLength6.getText());
            //Получение наличия для 3 ряда
            Float Nalichie7 = Float.parseFloat(DownLength7.getText());
            Float Nalichie8 = Float.parseFloat(DownLength8.getText());
            Float Nalichie9 = Float.parseFloat(DownLength9.getText());
            //Получение наличия для 4 ряда
            Float Nalichie10 = Float.parseFloat(DownLength10.getText());
            Float Nalichie11 = Float.parseFloat(DownLength11.getText());
            Float Nalichie12 = Float.parseFloat(DownLength12.getText());
            //Вывод значений разницы в String
            String Dif1 = String.format("%.02f",(Nalichie1-Pair1));
            String Dif2 =String.format("%.02f",(Nalichie2-Pair2));
            String Dif3 =String.format("%.02f",(Nalichie3-Pair3));
            String Dif4 =String.format("%.02f",(Nalichie4-Pair4));
            String Dif5 =String.format("%.02f",(Nalichie5-Pair5));
            String Dif6 =String.format("%.02f",(Nalichie6-Pair6));
            String Dif7 =String.format("%.02f",(Nalichie7-Pair7));
            String Dif8 =String.format("%.02f",(Nalichie8-Pair8));
            String Dif9 =String.format("%.02f",(Nalichie9-Pair9));
            String Dif10 =String.format("%.02f",(Nalichie10-Pair10));
            String Dif11 =String.format("%.02f",(Nalichie11-Pair11));
            String Dif12 =String.format("%.02f",(Nalichie12-Pair12));

            //Получение разницы для 1 ряда
            UpDif1.setText(Dif1);
            UpDif2.setText(Dif2);
            UpDif3.setText(Dif3);
            //Получение разницы для 2 ряда
            UpDif4.setText(Dif4);
            UpDif5.setText(Dif5);
            UpDif6.setText(Dif6);
            //Получение разницы для 3 ряда
            DownDif7.setText(Dif7);
            DownDif8.setText(Dif8);
            DownDif9.setText(Dif9);
            //Получение разницы для 4 ряда
            DownDif10.setText(Dif10);
            DownDif11.setText(Dif11);
            DownDif12.setText(Dif12);
            //Получение суммы 4 верхних резцов
            Float SumRezUp = T11 + T12 + T21 + T22;
            //Получение суммы 4 нижних резцов
            Float SumRezDown = T31 + T32 + T41 + T42;
            //Получение суммы верхних 12 зубов
            Float SumUp = T11+T12+T13+T14+T15+T16+T21+T22+T23+T24+T25+T26;
            //Получение суммы нижних 12 зубов
            Float SumDown = T31+T32+T33+T34+T35+T36+T41+T42+T43+T44+T45+T46;
            //Расчет ширины зубной дуги
            Float CalcWidthForward = SumRezUp*1.25f;
            Float CalcWidthBack = SumRezUp*1.54f;
            //Отображение ширины зубной дуги
            WidthFront.setText(String.valueOf(CalcWidthForward));
            WidthBack.setText(String.valueOf(CalcWidthBack));
            //Индекс Тона
            Float IndexTonNorma = 1.33f;
            Float IndexTonCalc = SumRezUp/SumRezDown;
            String IndexTomString = String.format("%.02f",IndexTonCalc);
            NumberOfTon.setText(IndexTomString);
            if (IndexTonCalc>IndexTonNorma){
                TextOfTon.setText("-Глубокое перекрытие\n-Макродентия верхних " +
                        "резцов или микродентия нижних резцов\nили сочетание " +
                        "этих двух причин ");
            }
            else if (IndexTonCalc < IndexTonNorma){
                TextOfTon.setText("-Минимальное перекрытие или прямое соотношение\n-Микродентия верхних " +
                        "резцов или макродентия нижних резцов\nили сочетание " +
                        "этих двух причин ");
            } else if (IndexTonCalc == IndexTonNorma) {
                TextOfTon.setText("-Верхние резцы перекрывают нижние на 1/3 высоты коронки");
            }
            //Индекс Болтона
            Float IndexBoltonOtklonenieOtric = 91.15f;
            Float IndexBoltonOtkloneniePlus = 91.45f;
            Float IndexBoltonCalc = SumDown/SumUp;
            String IndexBoltonString = String.format("%.02f",IndexBoltonCalc);
            NumberOfBolton.setText(IndexBoltonString);
            if ((IndexBoltonCalc >= IndexBoltonOtklonenieOtric) && (IndexBoltonCalc <= IndexBoltonOtkloneniePlus)) {
                TextOfBolton.setText("Норма");
            }
            else if (IndexBoltonCalc < IndexBoltonOtklonenieOtric) {
                TextOfBolton.setText("Микродентия нижних зубов или\nмакродентия верхних зубов или сочетание \nэтих двух причин");
            } else if (IndexBoltonCalc > IndexBoltonOtkloneniePlus) {
                TextOfBolton.setText("Макродентия нижних зубов или\nмикродентия верхних зубов или сочетание \nэтих двух причин");
            }
            //Индекс Коркхауза
            Float IndexKorkhauzUp = Float.parseFloat(KorkHauzUp.getText());
            Float IndexKorkhauzDown = Float.parseFloat(KorkHauzDown.getText());
            Float NormaKorkhauzUp = (SumRezUp*100)/170;
            String NormaKorkhauzUpString = String.format("%.02f",NormaKorkhauzUp);
            Float NormaKorkhauzDown = NormaKorkhauzUp-2;
            String NormaKorkhauzDownString = String.format("%.02f",NormaKorkhauzDown);
            if (IndexKorkhauzUp < NormaKorkhauzUp) {
                KorkhauzVivodUp.setText("Длина верхней челюсти меньше нормы. Норма:"+NormaKorkhauzUpString);
            } else if (IndexKorkhauzUp == NormaKorkhauzUp) {
                KorkhauzVivodUp.setText("Соотвествует индексу"+NormaKorkhauzUpString);
            } else if (IndexKorkhauzUp > NormaKorkhauzUp) {
                KorkhauzVivodUp.setText("Длина верхней челюсти меньше нормы. Норма:"+NormaKorkhauzUpString);
            }
            if (IndexKorkhauzDown < NormaKorkhauzDown){
                KorkhauzVivodDown.setText("Длина нижней челюсти меньше нормы. Норма:"+NormaKorkhauzDownString);
            } else if (IndexKorkhauzDown == NormaKorkhauzDown) {
                KorkhauzVivodDown.setText("Соответствует индексу"+NormaKorkhauzDownString);
            } else if (IndexKorkhauzDown > NormaKorkhauzDown) {
                KorkhauzVivodDown.setText("Длина нижней челюсти больше нормы. Норма:"+NormaKorkhauzDownString);
            }
            //Индекс Пона
            Float IndexPonUp1 = Float.parseFloat(PonUp1.getText());
            Float IndexPonUp2 = Float.parseFloat(PonUp2.getText());
            Float IndexPonDown1 = Float.parseFloat(PonDown1.getText());
            Float IndexPonDown2 = Float.parseFloat(PonDown2.getText());
            Float PonIdealPered = (SumRezUp*100)/85;
            Float PonIdealZad = (SumRezUp*100)/65;
            String PonIdealPeredString = String.format("%.02f",PonIdealPered);
            String PonIdealZadString = String.format("%.02f",PonIdealZad);
            PonNormaUp.setText(PonIdealPeredString);
            PonNormaNiz.setText(PonIdealZadString);
            if (IndexPonUp1 > PonIdealPered){
                PonVivodUp1.setText("Больше нормы");
            } else if (IndexPonUp1 == PonIdealPered) {
                PonVivodUp1.setText("Норма");
            } else if (IndexPonUp1 < PonIdealPered) {
                PonVivodUp1.setText("Меньше нормы");
            }
            if (IndexPonUp2 > PonIdealZad){
                PonVivodUp2.setText("Больше нормы");
            } else if (IndexPonUp2 == PonIdealZad) {
                PonVivodUp2.setText("Норма");
            } else if (IndexPonUp2 < PonIdealZad) {
                PonVivodUp2.setText("Меньше нормы");
            }
            if (IndexPonDown1 > PonIdealPered){
                PonVivodDown1.setText("Больше нормы");
            } else if (IndexPonDown1 == PonIdealPered) {
                PonVivodDown1.setText("Норма");
            } else if (IndexPonDown1 < PonIdealPered) {
                PonVivodDown1.setText("Меньше нормы");
            }
            if (IndexPonDown2 > PonIdealZad){
                PonVivodDown2.setText("Больше нормы");
            } else if (IndexPonDown2 == PonIdealZad) {
                PonVivodDown2.setText("Норма");
            } else if (IndexPonDown2 < PonIdealZad) {
                PonVivodDown2.setText("Меньше нормы");
            }



        });

    }

}
Знаю, что и приложение написал очень корявым языком, но хочется понять, что же нужно и как лучше справиться с данной задачей, чтобы приложение либо преобразовать в файл для MacOs каким то образом. Или что нужно поставить на Mac чтобы jar файл запускался. Буду очень благодарен за подсказки. Может стоит скачать старую InteliJ и написать обычное JavaFx приложение через JDK 8 без использования внутри Maven.