FXML JAVAFX中的ActionHandler错误

时间:2015-06-05 17:48:27

标签: java

我使用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
}



}

2 个答案:

答案 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
然后我的计划完美无缺 感谢大家的帮助