添加 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
参数。您需要稍后进行设置。
我已经检查了其他几个帖子,但找不到答案。将控制器和 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
参数。您需要稍后进行设置。