Всем доброе утро, день или вечер!
Новичок нуждается в помощи, ибо очень тупит.
Решил создать приложение подруге на 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.