2016-03-27 18 views
1

Ich bin relativ neu zu javafx und fxml. Ich versuche es mir selbst beizubringen! Als ich jedoch ein Programm für eine einfache Login-GUI erstellte, kam es zu einem Problem, als ich schließlich versuchte, mein Programm auszuführen. Es sagte mir, dass es in meiner Klasse keine Hauptmethode gibt und ich bin nicht sicher, wie ich das beheben soll. Irgendwelche Ideen?javafx fxml Programmfehler (keine Hauptmethode)

Mein Programm erstellt einen Anmeldebildschirm und wenn Sie "test" für den Benutzernamen und das Passwort eingeben, gelangen Sie zu einer anderen Szene.

Hier ist meine Login.java

package com; 

    import javafx.application.Application; 
    import javafx.fxml.FXMLLoader; 
    import javafx.stage.Stage; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 

    /** 
    * 
    * @author Tyler 
    */ 
    public class Login extends Application{ 

     @Override 
     public void start(Stage stage) throws Exception { 
      Parent root = FXMLLoader.load(getClass().getResource("Login.fxml")); 
      Scene scene = new Scene(root); 
      stage.setScene(scene); 
      stage.setTitle("Login"); 
      stage.show(); 
     } 

    } 

Hier mein LoginController.java

package com; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.PasswordField; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 

/** 
* FXML Controller class 
* 
* @author Tyler 
*/ 
public class LoginController implements Initializable { 

    @FXML 
    private Label lblMessage; 
    @FXML 
    private TextField txtUsername; 
    @FXML 
    private PasswordField txtPassword; 
    @FXML 
    private void btnLoginAction(ActionEvent event) throws Exception{ 
     if(txtUsername.getText().equals("test") && txtPassword.getText().equals("test")){ 
      ((Node) (event.getSource())).getScene().getWindow().hide(); 
      Parent parent = FXMLLoader.load(getClass().getResource("DateSelection.fxml")); 
      Stage stage = new Stage(); 
      Scene scene = new Scene(parent); 
      stage.setScene(scene); 
      stage.setTitle("Date Selection"); 
      stage.show(); 
     }else{ 
      lblMessage.setText("Username or Password is invalid!"); 
     } 
    } 
    /** 
    * Initializes the controller class. 
    * @param url 
    * @param rb 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

} 

Hier ist mein Login.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.text.*?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" fx:id="lblMessage" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.LoginController"> 
    <children> 
     <PasswordField fx:id="txtPassword" layoutX="200.0" layoutY="200.0" prefHeight="30.0" prefWidth="200.0" promptText="Password" /> 
     <TextField fx:id="txtUsername" layoutX="200.0" layoutY="140.0" prefHeight="30.0" prefWidth="200.0" promptText="Username" /> 
     <Button fx:id="btnLogin" layoutX="269.0" layoutY="251.0" mnemonicParsing="false" onAction="#btnLoginAction" prefHeight="30.0" text="Login"> 
     <font> 
      <Font size="14.0" /> 
     </font></Button> 
     <Label fx:id="lblMessage" layoutX="283.0" layoutY="71.0" text="Label" /> 
    </children> 
</AnchorPane> 

Here is my DateSelectionController.java

package com; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 

/** 
* FXML Controller class 
* 
* @author Tyler 
*/ 
public class DateSelectionController implements Initializable { 

    /** 
    * Initializes the controller class. 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

} 

Hier ist meine DateSelection.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.text.*?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="com.DateSelectionController"> 
    <children> 
     <Label layoutX="191.0" layoutY="164.0" text="Welcome"> 
     <font> 
      <Font name="System Bold" size="50.0" /> 
     </font> 
     </Label> 
    </children> 
</AnchorPane> 

Antwort

1

From Oracle:

Die Methode main() ist nicht für die JavaFX-Anwendungen erforderlich ist, wenn die JAR-Datei für Die Anwendung wird mit dem JavaFX Packager-Tool erstellt, in das das Jav eingebettet ist aFX Launcher in der JAR-Datei. Es ist jedoch hilfreich, die Methode main() einzuschließen, damit Sie JAR-Dateien ausführen können, die ohne den JavaFX-Start erstellt wurden, z. B. wenn Sie eine IDE verwenden, in der die JavaFX-Tools nicht vollständig integriert sind. Außerdem erfordern Swing-Anwendungen, die JavaFX-Code einbetten, die main() -Methode.

Eine Lösung besteht also darin, sicherzustellen, dass sie so erstellt wird, dass die JavaFX-Tools vollständig unterstützt werden. Die andere Lösung besteht darin, eine main Methode hinzuzufügen, um die Anwendung zu starten. Das würde mögliche Probleme wie diese vermeiden und verursacht keine Probleme, wenn es nicht benötigt wird.

Ihre Hauptmethode soll wie folgt aussehen:

public static void main(String[] args){ 
    Application.launch(Login.class, args); 
} 

die einfach Kontrolle auf JavaFX passieren zu handhaben, wie es wäre normal.

Verwandte Themen