我使用javafx和scenebuilder 2.0在netbeans中创建了一个基本的登录屏幕!通过复制youtube教程。
<Button id="btnLogin" layoutX="146.0" layoutY="243.0" mnemonicParsing="false" onAction="#initialize" prefHeight="59.0" prefWidth="76.0" text="Login" />
如上所示,netbeans强调“#initialize”并给出以下错误“Handler方法无法访问。使用@FXML公开或注释”
并且该程序不想启动甚至不显示我的舞台。
的LoginController:
@FXML private void initialize (ActionEvent event)
{
System.out.println("test");
}
如果我只是删除代码“onAction =”#initialize“我的程序运行并向我显示一个界面,但我的登录按钮不起作用(显然)
P.S。公开它不起作用
任何建议都会提前感谢,感谢
代码:
主:
public class Login extends Application
{
@Override
public void start(Stage stage) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource("/fxml/Login.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Login");
stage.show();
}
控制器:
public class LoginController implements Initializable {
@FXML
private Label lblmessage;
@FXML
private TextField txtUsername;
@FXML
private Button btnLogin;
@FXML
private PasswordField txtPassword;
@FXML private void handlebutton()
{
System.out.println("test");
}
/**
* Initializes the controller class.
* @param url
* @param rb
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
答案 0 :(得分:1)
我猜方法名称就是问题所在。
方法@FMXL protected void initialize()
可以在启动时用作附加回调
您可以使用initialize
方法,例如动态填充你的用户界面。
所以:
尝试在代码和fxml文件中重命名该方法。
给定here:
FXMLLoader类的一个实例只是查找initialize() 控制器上的方法并调用它(如果可用)。请注意,与其他FXML回调方法(如事件处理程序)类似,如果该方法不公开,则必须使用@FXML注释进行注释。
我刚刚重建了你的代码。我还将这个主要方法添加到Login:
public static void main(String[] args){
launch(args);
}
这是Login.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<VBox 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="LoginController">
<children>
<Label fx:id="lblmessage" text="Label" />
<TextField fx:id="txtUsername" />
<Button fx:id="btnLogin" mnemonicParsing="false" onAction="#handlebutton" text="Button" />
<PasswordField fx:id="txtPassword" />
</children>
</VBox>
通过这种设置,一切都按预期工作 加载舞台,单击按钮时调用handlebutton方法,并在启动时调用initialize方法 目前错误似乎不可重现。
答案 1 :(得分:0)
谢谢大家!我的问题是在我的fxml文件中我命名了我的textfields /密码字段字段
<TextField id="txtUsername"....... etc
<Label id="lblmessage" ...... etc
<PasswordField id="txtPassword".... etc
因此每当我试图从我的控制器/主类访问那些变量时,我每次都收到一个空指针,因为我的程序没有收到任何数据,因为我忘记了我的fX:id,所以上面应该看起来像以下
<TextField fx:id="txtUsername"....... etc
<Label fx:id="lblmessage" ...... etc
<PasswordField fx:id="txtPassword".... etc
然后我的计划完美无缺
感谢大家的帮助