更改场景构建器和 jdk 后,javaFX 程序无法运行 [英] javaFX program not working after changing the scene builder and jdk
问题描述
我的程序之前运行良好,我将场景构建器从 JavaFx 场景构建器 2.0 更改为 gluon 场景构建器 10,以添加一些 CSS 样式.我添加了样式,程序显示错误,例如警告:使用 10.0.1 版的 JavaFX API 加载 FXML 文档,使用 9.0.4 版的 JavaFX 运行时然后我将我的 JDK 更新到 10.0.2 版,但是它 stii 显示这样的错误.
My program worked perfectly before, And I changed my scene builder to gluon scene builder 10 from JavaFx scene builder 2.0 to add some CSS styling. I added the styling and the program showed errors like WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 9.0.4 And then I updated my JDK to version 10.0.2 but it stii shows errors like this.
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/css/parser/CSSParser
at de.jensd.fx.glyphs.GlyphIcon.<clinit>(GlyphIcon.java:48)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at java.base/java.lang.Class.newInstance(Class.java:560)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1019)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3253)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3210)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3129)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3122)
at sample.Main.start(Main.java:17)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
... 1 more
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.css.parser.CSSParser
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 27 more
Exception running application sample.Main
我的主要课程是
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("../Interface/sample.fxml"));
primaryStage.setTitle("JFS");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我的控制器类是
public class Controller {
public TextField newsletterEmail;
public JFXButton regButton;
public JFXTextField loginUserName;
public JFXPasswordField loginPassword;
public JFXButton loginButton;
Connectivity connection = new Connectivity();
Connection connec = connection.getConnection();
SceneSwitcher sceneSwitcher = new SceneSwitcher();
ViewMyAccount viewMyAccount = new ViewMyAccount();
loginValidation validateLogin = new loginValidation();
public void loginButtonClicked(ActionEvent actionEvent) {
System.out.println(loginUserName.getText());
/*viewMyAccount.setMailLabel(loginUserName.getText());
System.out.println(viewMyAccount.getMailLabel());*/
boolean validateCustomer = validateLogin.CusLoginValidate(loginUserName.getText(),loginPassword.getText(),connec);
boolean validateStaff = validateLogin.StaffLoginValidate(loginUserName.getText(),loginPassword.getText(),connec);
boolean validateOwner = validateLogin.OwnerLoginValidate(loginUserName.getText(),loginPassword.getText(),connec);
if(loginUserName.getText().equals("") || loginPassword.getText().equals("")){
AlertBox.displayAlertBox("ERROR!","Both fields can't be empty!");
}else{
if(validateCustomer){
sceneSwitcher.switchScene(loginButton,"customerView.fxml","Customer");
}else if(validateStaff){
sceneSwitcher.switchScene(loginButton,"staffView.fxml","Customer");
}else if(validateOwner){
sceneSwitcher.switchScene(loginButton,"ownerView.fxml","Customer");
}else{
AlertBox.displayAlertBox("ERROR!","Invalid Username or Password! ");
}
}
}
public void registerButtonClicked(ActionEvent actionEvent) {
sceneSwitcher.switchScene(regButton,"register.fxml","Register");
}
NewsletterValidation validateEmail = new NewsletterValidation();
public void newsletterButtonClicked(ActionEvent actionEvent) throws SQLException {
boolean isNewsletterEmailEmpty = validateEmail.invalidError(newsletterEmail);
boolean isValid = validateEmail.isValidEmailAddress(newsletterEmail);
boolean isEmailExist = validateEmail.checkEmailExists(newsletterEmail.getText(),connec);
if(isNewsletterEmailEmpty && isValid && isEmailExist){
PreparedStatement pstmt = null;
String sql = "INSERT INTO `nwemails` (`email`)
" +
"VALUES (?);";
try {
pstmt = connec.prepareStatement(sql);
pstmt.setString(1,newsletterEmail.getText());
int i = pstmt.executeUpdate();
System.out.println("newsletter email update status = " + i);
AlertBox.displayAlertBox("Alert!","You have successfully signed up for the news letter");
} catch (SQLException e) {
System.err.println(e);
}finally {
pstmt.close();
}
}else{
System.out.println("Validation failed");
}
}
}
我的 FXML 文件是
my FXML file is
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXPasswordField?>
<?import com.jfoenix.controls.JFXTextField?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@../CSS/dracula.css" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<Label layoutX="227.0" layoutY="259.0" prefHeight="17.0" prefWidth="127.0" text="Don't have an account?" />
<Label layoutX="207.0" prefHeight="74.0" prefWidth="182.0" text="JFS" AnchorPane.leftAnchor="207.0" AnchorPane.rightAnchor="211.0" AnchorPane.topAnchor="0.0">
<font>
<Font name="Matura MT Script Capitals" size="53.0" />
</font>
</Label>
<Label layoutX="241.0" layoutY="98.0" prefHeight="17.0" prefWidth="118.0" text="Jeff's Fishing Shack" textAlignment="CENTER">
<font>
<Font name="Marlett" size="13.0" />
</font>
</Label>
<Button layoutX="186.0" layoutY="370.0" mnemonicParsing="false" onAction="#newsletterButtonClicked" prefHeight="25.0" prefWidth="210.0" text="Send me Updates" />
<Label layoutX="111.0" layoutY="316.0" prefHeight="17.0" prefWidth="378.0" text="Or sign up for The free newsletter covering the top industry headlines" />
<TextField fx:id="newsletterEmail" layoutX="195.0" layoutY="339.0" prefHeight="25.0" prefWidth="191.0" promptText="Email" />
<JFXTextField fx:id="loginUserName" layoutX="203.0" layoutY="136.0" prefHeight="25.0" prefWidth="191.0" promptText="Username (email)" />
<JFXPasswordField fx:id="loginPassword" layoutX="203.0" layoutY="185.0" prefHeight="25.0" prefWidth="191.0" promptText="Password" />
<FontAwesomeIconView glyphName="USER" layoutX="171.0" layoutY="161.0" size="25.0" wrappingWidth="15.0" />
<FontAwesomeIconView glyphName="KEY" layoutX="170.0" layoutY="208.0" size="25.0" wrappingWidth="15.0" />
<JFXButton fx:id="loginButton" layoutX="265.0" layoutY="225.0" onAction="#loginButtonClicked" text="LOGIN" />
<JFXButton fx:id="regButton" layoutX="257.0" layoutY="284.0" onAction="#registerButtonClicked" text="REGISTER" />
</children>
</AnchorPane>
堆栈跟踪将此显示为错误的行
The stacktrace show this like as the wrong line
Parent root = FXMLLoader.load(getClass().getResource("../Interface/sample.fxml"));
我已经浪费了 3 个多小时来寻找答案.所以请帮我解决这个问题.
I've been wasting more than 3 hours for finding an answer. So please help me with this.
字体很棒的版本:
推荐答案
这个错误:
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/css/parser/CSSParser
at de.jensd.fx.glyphs.GlyphIcon.<clinit>(GlyphIcon.java:48)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
表示您的依赖项之一 (de.jensd.fx.glyphs.GlyphIcon
) 正在尝试访问不存在的类 (com.sun.javafx.css.parser.CSSParser
) 在您的 JDK 9/10 中.
indicates that one of your dependencies (de.jensd.fx.glyphs.GlyphIcon
) is trying to access a non existing class (com.sun.javafx.css.parser.CSSParser
) in your JDK 9/10.
在 Java 9 版本中,许多私有的 JavaFX 类 (com.sun.javafx.*
) 被移至公共 API(在本例中为 javafx.css.parser.CSSParser
).
With the Java 9 release, many JavaFX classes that were private (com.sun.javafx.*
) were moved to public API (in this case, javafx.css.parser.CSSParser
).
如果您在 Java 9 或 10 上运行,则必须使用至少与 Java 9 兼容的第三方依赖项.
If you run on Java 9 or 10, you have to use third party dependencies at least compatible with Java 9.
从您的依赖项列表中:
- 控件FX
8.40.11 兼容 Java/JavaFX 8.您需要使用 ControlsFX 9.0.0
8.40.11 is compatible with Java/JavaFX 8. You need to use ControlsFX 9.0.0
您可以下载jar 来自 Maven Central,或者添加 maven/gradle 坐标:
You can download the jar from Maven Central, or add the maven/gradle coordinates:
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>9.0.0</version>
</dependency>
或:
compile 'org.controlsfx:controlsfx:9.0.0'
- FontAwesomeFX
FontAwesomeFX 8.15 也兼容Java/JavaFX 8,所以需要使用9个版本:
FontAwesomeFX 8.15 is also compatible with Java/JavaFX 8, so you need to use the 9 versions:
罐子:fontawesomefx-commons, fontawesomefx 控件
或依赖项:
compile 'de.jensd:fontawesomefx-commons:9.1.2'
compile 'de.jensd:fontawesomefx-controls:9.1.2'
其他:
compile 'de.jensd:fontawesomefx-emojione:3.1.1-9.1.2'
compile 'de.jensd:fontawesomefx-fontawesome:4.7.0-9.1.2'
compile 'de.jensd:fontawesomefx-icons525:4.2.0-9.1.2'
compile 'de.jensd:fontawesomefx-materialdesignfont:2.0.26-9.1.2'
compile 'de.jensd:fontawesomefx-materialicons:2.2.0-9.1.2'
compile 'de.jensd:fontawesomefx-octicons:4.3.0-9.1.2'
compile 'de.jensd:fontawesomefx-weathericons:2.0.10-9.1.2'
最后,正如评论中发布的那样,警告只是表明您的 FXML 是使用运行它的 JDK 的较新版本创建的.可以忽略.
Finally, as posted in comments, the warning is just an indication that your FXML was created with a newer version that the JDK running it. It can be ignored.
这篇关于更改场景构建器和 jdk 后,javaFX 程序无法运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!