添加 fx:controller 时出现 InvocationTargetException

InvocationTargetException when I add fx:controller

我已经检查了其他几个帖子,但找不到答案。将控制器和 onAction 标记添加到按钮时出现错误 (InvocationTargetException)。也许有人可以发现错误?如果我删除窗格标记中的 fx:controller 和按钮的按钮 onaction 属性,它会加载 fxml 表单。谢谢!

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="phonebook.UI.UI">
    <children>
      <TableView layoutX="199.0" prefHeight="350.0" prefWidth="401.0">
        <columns>
          <TableColumn prefWidth="106.0" text="First Name" />
          <TableColumn prefWidth="90.0" text="Last Name" />
            <TableColumn prefWidth="110.0" text="Number" />
            <TableColumn prefWidth="94.0" text="Address" />
        </columns>
      </TableView>
      <TextField fx:id="txtPhone_number" layoutX="37.0" layoutY="275.0" promptText="Phone Number" />
      <TextField fx:id="txtAddress" layoutX="37.0" layoutY="310.0" promptText="Address" />
      <Button fx:id="btnAdd" layoutX="134.0" layoutY="355.0" mnemonicParsing="false" onAction="#btnAddPerson" text="Add" />
      <TextField fx:id="txtSearch" layoutX="37.0" layoutY="82.0" promptText="Search by name" />
      <Button layoutX="127.0" layoutY="120.0" mnemonicParsing="false" text="Search" />
      <Button layoutX="450.0" layoutY="355.0" mnemonicParsing="false" text="Update" />
      <Button layoutX="517.0" layoutY="355.0" mnemonicParsing="false" text="Remove" />
      <TextField fx:id="txtLastName" layoutX="37.0" layoutY="240.0" promptText="Last name" />
      <TextField fx:id="txtFirstName" layoutX="37.0" layoutY="205.0" promptText="First name" />
      <Label layoutX="14.0" layoutY="14.0" text="Phone Book" textFill="#aeacac">
         <font>
            <Font size="31.0" />
         </font>
      </Label>
   </children>
</Pane>

还有...

package phonebook.UI;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import static javafx.application.ConditionalFeature.FXML;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class UI implements Initializable{

    //FXML Variables
    @FXML
    private TextField txtFirstName;
    @FXML
    private TextField txtLastName;
    @FXML
    private TextField txtPhone_number;
    @FXML
    private TextField txtAddress;
    @FXML 
    private Button btnAdd;

    //regular variables
    private Stage ms;

    public UI(Stage stage) {
        this.ms = stage;
    }

    public void stageOne() throws Exception{

        Parent root = FXMLLoader.load(getClass().getResource("UI.fxml"));
        Scene scene = new Scene(root);

        //set the stage and scene
        ms.setTitle("Phone Book.");
        ms.setScene(scene);
        ms.show();
    }

    @FXML
    protected void btnAddPerson(ActionEvent event) throws Exception {

    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

错误:

run:
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:497)
    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:497)
    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$launchApplication6(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: 
/C:/Users/Ohlaph/Documents/NetBeansProjects/PhoneBook/build/classes/phonebook/UI/UI.fxml:8

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.access0(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:932)
    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 phonebook.UI.UI.stageOne(UI.java:41)
    at phonebook.PhoneBook.start(PhoneBook.java:17)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication13(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait6(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null4(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater5(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$null9(WinApplication.java:191)
    ... 1 more
Caused by: java.lang.InstantiationException: phonebook.UI.UI
    at java.lang.Class.newInstance(Class.java:427)
    at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927)
    ... 23 more
Caused by: java.lang.NoSuchMethodException: phonebook.UI.UI.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 25 more
Exception running application phonebook.PhoneBook
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

btnAddPerson 没有访问修饰符,因此是 "package private"。 如果它是从不同的包中调用的,它将不可见。 你试过protected吗?

你还应该

@FXML private Button btnAdd;

?


编辑:

Caused by: java.lang.NoSuchMethodException: phonebook.UI.UI.<init>() 意味着你需要有一个 public 构造函数 而没有 一个 Stage 参数。添加:

public UI(){
}

你可能想要

public setStage(Stage s){
  this.ms=s;
}

并且您需要另一种方式来设置舞台。 这是因为 UI 构造是自动完成的,所以 FX 在构造时无法知道要传递什么 stage 参数。您需要稍后进行设置。