Метод загрузки Javafx-FXMLLoader не может создать экземпляр класса контроллера

#java

#java

Вопрос:

Я проверил все решения, похожие на мою проблему, но мое по-прежнему осталось прежним. Мой файл Painter.fxml, PainterController.java файл и Painter.java все файлы, содержащие метод main, находятся в одной папке, но все еще выдают мне ошибку во время выполнения. Основная проблема заключается в том, что основной класс, который содержал метод загрузки FXMLLoader, не может неявно создать экземпляр класса контроллера во время выполнения программы. Пожалуйста, как мне решить эту проблему?

                         MAIN CLASS:
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.stage.Stage;

 public class Painter extends Application
 {
     public void start(Stage stage) throws Exception
    {
        Parent root =FXMLLoader.load(getClass().getResource("Painter.fxml"));

    Scene scene = new Scene(root);
    stage.setTitle("Painter");
    stage.setScene(scene);
    stage.show();
    }
    public static void main(String[] args)
    {
       launch(args);
    }
 }

                       CONTROLLER CLASS:
// PainterController.java
// Controller for the Painter app
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Circle;

public class PainterController
{
   // enum representing pen sizes
   private enum PenSize{
     SMALL(2),
     MEDIUM(4),
     LARGE(6);

     private final int radius;

     PenSize(int radius) {this.radius = radius;}

     public int getRadius() {return radius;}
    };

    // instance variables that refer to GUI components
    @FXML private RadioButton blackRadioButton;
    @FXML private RadioButton redRadioButton;
    @FXML private RadioButton greenRadioButton;
    @FXML private RadioButton blueRadioButton;
    @FXML private RadioButton smallRadioButton;
    @FXML private RadioButton mediumRadioButton;
    @FXML private RadioButton largeRadioButton;
    @FXML private ToggleGroup colorToggleGroup;
    @FXML private ToggleGroup sizeToggleGroup;
    @FXML private Pane drawingAreaPane;

  // instance variables for managing Painter state
  private PenSize radius = PenSize.MEDIUM; // radius of circle
  private Paint brushColor = Color.BLACK; // drwing color

  // set user data for the RadioButtons
  @FXML
  public void initialize()
  {
    // user data on a control can be any Object
    blackRadioButton.setUserData(Color.BLACK);
    redRadioButton.setUserData(Color.RED);
    greenRadioButton.setUserData(Color.GREEN);
    blueRadioButton.setUserData(Color.BLUE);
    smallRadioButton.setUserData(PenSize.SMALL);
    mediumRadioButton.setUserData(PenSize.MEDIUM);
    largeRadioButton.setUserData(PenSize.LARGE);
  }

  // handles drawingArea's onMouseDragged MouseEvent
  @FXML
  private void drawingAreaMouseDragged(MouseEvent event)
  {
    Circle newCircle = new Circle(event.getX(), event.getY(), 
     radius.getRadius(), brushColor);
    drawingAreaPane.getChildren().add(newCircle);
  }

  // handles color RadioButton's ActionEvents
  @FXML
  private void colorRadioButtonSelected(ActionEvent event)
  {
    // user data for each color RadioButton is the corresponding Color
    brushColor = 
     (Color) colorToggleGroup.getSelectedToggle().getUserData();
  }

  // handles size RadioButton's ActionEvents
  @FXML
  private void sizeRadioButtonSelected(ActionEvent event)
  {
    // user data for each size RadioButton is the corresponding PenSize
    radius = 
     (PenSize) sizeToggleGroup.getSelectedToggle().getUserData();
  }

  // handles Undo Button's ActionEvents
  @FXML
  private void undoButtonPressed(ActionEvent event)
  {
    int count = drawingAreaPane.getChildren().size();

    // if there are any shapes remove the last one added
    if (count > 0)
    {
     drawingAreaPane.getChildren().remove(count - 1);
    }
  }

  // handles Clear Button's ActionEvents
  @FXML
  private void clearButtonPressed(ActionEvent event)
  {
    drawingAreaPane.getChildren().clear(); // clear the canvas
  }
  

}

                     RUN TIME ERRORS:

C:JAVAFX2>java Painter
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$159(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
  

Вызвано: javafx.fxml.Исключение LoadException:
/C:/JAVAFX2/Painter.fxml:12

         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 Painter.start(Painter.java:12)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(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$152(WinApplication.java:177)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: PainterController
    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 Painter
  

Комментарии:

1. Файл Painter.fxml должен находиться в той же папке, что и file Painter.class Обратите внимание, что я говорю о скомпилированном классе, а не о файле исходного кода.

2. Я понял вас правильно. Все файлы находятся в одной папке; как Painter.fxml, так и Painter.class все они находятся в одной папке. Проблема заключается в следующем, если я явно создам экземпляр PainterController.java в основном классе программа работает идеально, как я хочу. Но согласно книге (Deitel amp; Deitel 11 Edition), которую я использую, метод загрузки FXMLLoader отвечает за загрузку файла Painter.fxml и создание экземпляра PainterController.java во время выполнения.