Skip to content

Instantly share code, notes, and snippets.

@jewelsea
Created January 25, 2013 02:47
Show Gist options
  • Save jewelsea/4631319 to your computer and use it in GitHub Desktop.
Save jewelsea/4631319 to your computer and use it in GitHub Desktop.
JavaFX sample for an fxml based Login screen to main application transition with login session data transfer
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<StackPane prefWidth="231.0" xmlns:fx="http://javafx.com/fxml" fx:controller="login.LoginController">
<children>
<StackPane>
<children>
<VBox spacing="10.0">
<children>
<GridPane>
<children>
<Label text="Username:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TextField fx:id="user" promptText="Use &quot;open&quot; to login" text="open" GridPane.columnIndex="1" GridPane.rowIndex="0" />
<TextField fx:id="password" promptText="Use &quot;sesame&quot; to login" text="sesame" GridPane.columnIndex="1" GridPane.rowIndex="1" />
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="148.0" minWidth="10.0" prefWidth="109.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="228.0" minWidth="10.0" prefWidth="189.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
<StackPane prefHeight="-1.0" prefWidth="-1.0">
<children>
<Button fx:id="loginButton" alignment="CENTER" defaultButton="true" mnemonicParsing="false" text="Login" StackPane.alignment="CENTER_RIGHT" />
</children>
</StackPane>
</children>
</VBox>
</children>
</StackPane>
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</StackPane>
package login;
import javafx.event.*;
import javafx.fxml.FXML;
import javafx.scene.control.*;
/** Controls the login screen */
public class LoginController {
@FXML private TextField user;
@FXML private TextField password;
@FXML private Button loginButton;
public void initialize() {}
public void initManager(final LoginManager loginManager) {
loginButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
String sessionID = authorize();
if (sessionID != null) {
loginManager.authenticated(sessionID);
}
}
});
}
/**
* Check authorization credentials.
*
* If accepted, return a sessionID for the authorized session
* otherwise, return null.
*/
private String authorize() {
return
"open".equals(user.getText()) && "sesame".equals(password.getText())
? generateSessionID()
: null;
}
private static int sessionID = 0;
private String generateSessionID() {
sessionID++;
return "xyzzy - session " + sessionID;
}
}
package login;
import java.io.IOException;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import login.LoginManager;
/** Main application class for the login demo application */
public class LoginDemoApplication extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) throws IOException {
Scene scene = new Scene(new StackPane());
LoginManager loginManager = new LoginManager(scene);
loginManager.showLoginScreen();
stage.setScene(scene);
stage.show();
}
}
package login;
import java.io.IOException;
import java.util.logging.*;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
/** Manages control flow for logins */
public class LoginManager {
private Scene scene;
public LoginManager(Scene scene) {
this.scene = scene;
}
/**
* Callback method invoked to notify that a user has been authenticated.
* Will show the main application screen.
*/
public void authenticated(String sessionID) {
showMainView(sessionID);
}
/**
* Callback method invoked to notify that a user has logged out of the main application.
* Will show the login application screen.
*/
public void logout() {
showLoginScreen();
}
public void showLoginScreen() {
try {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("login.fxml")
);
scene.setRoot((Parent) loader.load());
LoginController controller =
loader.<LoginController>getController();
controller.initManager(this);
} catch (IOException ex) {
Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void showMainView(String sessionID) {
try {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("mainview.fxml")
);
scene.setRoot((Parent) loader.load());
MainViewController controller =
loader.<MainViewController>getController();
controller.initSessionID(this, sessionID);
} catch (IOException ex) {
Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<StackPane prefWidth="231.0" xmlns:fx="http://javafx.com/fxml" fx:controller="login.MainViewController">
<children>
<StackPane>
<children>
<VBox spacing="10.0">
<children>
<GridPane>
<children>
<Label text="Session ID:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label fx:id="sessionLabel" text="Undefined" GridPane.columnIndex="1" GridPane.rowIndex="0" />
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="148.0" minWidth="10.0" prefWidth="109.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="228.0" minWidth="10.0" prefWidth="189.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
<StackPane prefHeight="-1.0" prefWidth="-1.0">
<children>
<Button id="loginButton" fx:id="logoutButton" alignment="CENTER" defaultButton="true" mnemonicParsing="false" text="Logout" StackPane.alignment="CENTER_RIGHT" />
</children>
</StackPane>
</children>
</VBox>
</children>
</StackPane>
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</StackPane>
package login;
import javafx.event.*;
import javafx.fxml.FXML;
import javafx.scene.control.*;
/** Controls the main application screen */
public class MainViewController {
@FXML private Button logoutButton;
@FXML private Label sessionLabel;
public void initialize() {}
public void initSessionID(final LoginManager loginManager, String sessionID) {
sessionLabel.setText(sessionID);
logoutButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
loginManager.logout();
}
});
}
}
@ngangavic
Copy link

Thanks for this .You should make a change at
stage.setScene(scene);
stage.show();
to
primarystage.setScene(scene);
primarystage.show();

depend on what ur variable

You are correct. Thanks for the correction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment