【问题标题】:InvocationTargetException when I add fx:controller添加 fx:controller 时出现 InvocationTargetException
【发布时间】:2015-09-05 01:48:29
【问题描述】:

我检查了其他几个帖子,但找不到答案。向按钮添加控制器和 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$launchApplication$156(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.access$700(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$launchApplication1$163(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(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$149(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)

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

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

    你也应该有

    @FXML private Button btnAdd;
    

    ?


    编辑:

    Caused by: java.lang.NoSuchMethodException: phonebook.UI.UI.&lt;init&gt;() 意味着您需要有一个公共构造函数没有 Stage 参数。添加这个:

    public UI(){
    }
    

    你可能想拥有

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

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

    【讨论】:

    • 嗯,好的,你能发布错误的堆栈跟踪吗?
    • 我把它添加到了帖子的末尾。
    • Soo... 原始代码确实有效,但是,我的包、java 和 fxml 文件都以 UI 开头。我改为将包更改为 .view ,现在它工作正常。我猜是初学者的错误。进行您建议的更改以完善它!谢谢!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2019-05-29
    • 2011-08-31
    • 2022-12-15
    • 2017-09-11
    • 2019-07-20
    • 2018-12-20
    相关资源
    最近更新 更多