【问题标题】:Lots of exceptions in a simple JavaFX programm that implements a window with a lable and a button实现带有标签和按钮的窗口的简单 JavaFX 程序中的许多异常
【发布时间】:2016-12-02 22:07:52
【问题描述】:

我在同一个包应用程序中有类和 fxml 文件,当我尝试运行调用 fxml 文件 (Anwendungs.fxml) 的控制器类 (AnwendungsController.java) 之一时),我收到以下错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException: 
/D:/sciebo/Development/EclipseWorkspace/OOSP4%20(JavaFX)/bin/application/Anwendung.fxml:10

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.AnwendungsController.start(AnwendungsController.java:25)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: AnwendungsController
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
    ... 22 more
Exception running application application.AnwendungsController

AnwendungsController.java:

package application;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class AnwendungsController extends Application {

  @FXML
  public Button closeButton;

  @FXML
  public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
  }

  @Override
  public void start(Stage primaryStage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("Anwendung.fxml"));
    primaryStage.setTitle("Benutzerverwaltung");
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }
}

Anwendung.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<GridPane  fx:controller="AnwendungsController.Controller" 
    xmlns:fx="http://javafx.com/fxml" alignment="center"
    hgap="10" vgap="10">
    <padding>
        <Insets top="20" right="20" bottom="20" left="20" />
    </padding>
    <Label text="Sie können das System nun verwenden!"
        GridPane.rowIndex="0" />
    <Button text="Abbrechen" fx:id="closeButton" cancelButton="true" mnemonicParsing="false" onAction="#handleCloseButtonAction" GridPane.rowIndex="1" />
</GridPane>

【问题讨论】:

    标签: java javafx event-handling


    【解决方案1】:

    解决方案

    您的fx:controller 属性值错误。该值应反映控制器类的完全限定名称 (package.class)。你的包被命名为application,你的控制器类被命名为AnwendungsController

    代替:

    fx:controller="AnwendungsController.Controller" 
    

    用途:

    fx:controller="application.AnwendungsController" 
    

    其他建议

    此外,您的应用程序类也不应该是控制器类,因为这样做可能会给您带来不必要的痛苦。应用程序类中不应有@FXML 注入变量。请参阅:Javafx - Can application class be the controller class

    重组应用

    应用程序/Anwendung.fxml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.geometry.Insets?>
    <?import javafx.scene.layout.GridPane?>
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.Label?>
    
    <GridPane  fx:controller="application.AnwendungsController"
               xmlns:fx="http://javafx.com/fxml" alignment="center"
               hgap="10" vgap="10">
      <padding>
        <Insets top="20" right="20" bottom="20" left="20" />
      </padding>
      <Label text="Sie können das System nun verwenden!"
             GridPane.rowIndex="0" />
      <Button text="Abbrechen" fx:id="closeButton" cancelButton="true" mnemonicParsing="false" onAction="#handleCloseButtonAction" GridPane.rowIndex="1" />
    </GridPane>
    

    application/AnwendungsApp.java

    package application;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.*;
    import javafx.stage.Stage;
    
    public class AnwendungsApp extends Application {
      @Override
      public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Anwendung.fxml"));
        Parent root = loader.load();
        primaryStage.setTitle("Benutzerverwaltung");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
      }
    
      public static void main(String[] args) {
        launch(args);
      }
    }
    

    application/AnwendungsController.java

    package application;
    
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.scene.control.Button;
    import javafx.stage.Stage;
    
    public class AnwendungsController {
      @FXML
      public Button closeButton;
    
      @FXML
      public void handleCloseButtonAction(ActionEvent event) {
        Stage stage = (Stage) closeButton.getScene().getWindow();
        stage.close();
      }
    }
    

    【讨论】:

    • Intellij Idea 对 FXML 执行拼写检查以及以红色突出显示的检查,例如原始问题中显示的不正确的 fx:controller 值。您可能需要使用 Ultimate 版本来突出显示检查(我不确定)。终极版提供免费试用。可能还有其他工具也可以执行检查,例如e(fx)clipsenetbeans。根据我的经验,Idea 做得很合理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多