Как решить проблему JavaFX для использования всплывающих уведомлений - PullRequest
0 голосов
/ 31 октября 2019

Я изучаю JavaFX и мою IDE для этого - IDE NetBeans 8.2. У меня проблема, когда я хочу запустить проект. Мой пример проекта - Перетаскивание изображения в ImageView от разработчика сцены. ошибка:

Executing C:\Users\Mohammad Sadeghi\Documents\NetBeansProjects\DragDrop\dist\run1057050476\DragDrop.jar using platform C:\Program Files\Java\jdk1.8.0_212\jre/bin/java
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
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(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
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(Thread.java:748)
Caused by: java.lang.ClassCastException: javafx.scene.image.ImageView cannot be cast to javafx.scene.Parent
at dragdrop.DragDrop.start(DragDrop.java:22)
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
Exception running application dragdrop.DragDrop
Java Result: 1

мой FXMLDocument.fxml:

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

<?import javafx.scene.image.ImageView?>


<ImageView fx:id="ImgID" fitHeight="228.0" fitWidth="248.0" onDragDone="#ondragdone" pickOnBounds="true" preserveRatio="true" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="dragdrop.FXMLDocumentController"/>

FXMLDocumentController.java:

    /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package drag-drop;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.DragEvent;

/**
 *
 * @author Mohammad Sadeghi
 */
public class FXMLDocumentController implements Initializable {

    private Label label;
    @FXML
    private ImageView ImgID;

    public FXMLDocumentController() {
    }

    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }

    @Override
        public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

    @FXML
    private void ondragdone(DragEvent event) {

        List<File> fi=event.getDragboard().getFiles();

         try {
            Image img=new Image(new FileInputStream(fi.get(0)));

            ImgID.setImage(img);
        } catch (Exception e) {
              System.out.println("ERROR");
        }

    }
}

и мое главное приложение ():

public class DragDrop extends Application {

  @Override
  public void start(Stage stage) throws Exception {
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
  }


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

}

Я не знаю, для чего эта ошибка !! У меня почти такая же ошибка в другом проекте JavaFX, когда я использую Scenebuilder. кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 31 октября 2019

Если вы посмотрите на подпись FXMLLoader#load(URL), вы увидите:

public static <T> T load​(URL location) throws IOException

Обратите внимание на <T>? Это делает метод универсальным, а параметр типа используется в качестве возвращаемого типа метода. Это то, что позволяет вам присвоить результат вызова #load(URL) переменной любого типа, например, что вы делаете.

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

Вы можете буквально изменить тип root на любой другойтип и код все равно будет компилироваться. Однако в настоящее время в приведенном выше коде T выводится как Parent. В этом случае используется приведение, как если бы метод #load(URL) возвратил Object вместо T.

Parent root = (Parent) FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

Проблема в том, что ваш FXML объявляет корневой элемент длябыть ImageView. Это означает, что фактический тип объекта, возвращаемого методом #load(URL), равен ImageView, а не Parent, а класс ImageView не является подтипом Parent, то есть ClassCastException.

Один из вариантов - использовать ImageView root = ...;. Однако этого недостаточно, потому что вы пытаетесь использовать root в качестве корня Scene, который должен быть Parent. Лучшее решение - обернуть ImageView в Parent в файле FXML. Вот пример использования StackPane:

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

<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.StackPane?>

<StackPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" 
           fx:controller="dragdrop.FXMLDocumentController">
  <ImageView fx:id="ImgID" fitHeight="228.0" fitWidth="248.0" onDragDone="#ondragdone" 
             pickOnBounds="true" preserveRatio="true"/>
</StackPane>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...