2016-03-18 28 views
0

Ich bin sehr neu zu JavaFX, ich begann diese Woche mein Wissen nur aus kleinen Tutorials und Beispielprojekten die Syntax zu lernen basiert. Ich habe eine einfache Tabelle mit Lagerinformationen erstellt, mit der Sie Informationen hinzufügen und löschen können und ein Anmeldefenster für dieses Programm implementieren möchten. Ich habe das Login-Fenster erstellt, bin mir aber nicht sicher, wie es in meiner Hauptfunktion richtig implementiert werden kann.JavaFX - Login Fenster in meine Hauptfunktion

Main.java

Dieser enthält meinen Code für die Aktie Anwendung.

package sample; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXMLLoader; 
import javafx.geometry.Insets; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.TextField; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 


public class Main extends Application { 

    Stage window; 
    TableView<Stock> table; 
    TextField symbolInput, nameInput, openingPriceInput, closingPriceInput, changeInPriceInput; 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     window = primaryStage; 
     window.setTitle("Stock Application"); 

     //Symbol column 
     TableColumn<Stock, String> symbolColumn = new TableColumn<>("Symbol"); 
     symbolColumn.setMinWidth(100); 
     symbolColumn.setCellValueFactory(new PropertyValueFactory<>("symbol")); 

     //Name column 
     TableColumn<Stock, String> nameColumn = new TableColumn<>("Name"); 
     nameColumn.setMinWidth(100); 
     nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); 

     //Opening Price column 
     TableColumn<Stock, Double> openingPriceColumn = new TableColumn<>("Opening Price"); 
     openingPriceColumn.setMinWidth(100); 
     openingPriceColumn.setCellValueFactory(new PropertyValueFactory<>("openingPrice")); 

     //Closing Price column 
     TableColumn<Stock, Double> closingPriceColumn = new TableColumn<>("Closing Price"); 
     closingPriceColumn.setMinWidth(100); 
     closingPriceColumn.setCellValueFactory(new PropertyValueFactory<>("closingPrice")); 

     //Change in Price column 
     TableColumn<Stock, Double> changeInPriceColumn = new TableColumn<>("Change in Price"); 
     changeInPriceColumn.setMinWidth(100); 
     changeInPriceColumn.setCellValueFactory(new PropertyValueFactory<>("changeInPrice")); 

     //Symbol input 
     symbolInput = new TextField(); 
     symbolInput.setPromptText("Symbol"); 
     symbolInput.setMinWidth(100); 

     //Name input 
     nameInput = new TextField(); 
     nameInput.setPromptText("Name"); 

     //Opening Price input 
     openingPriceInput = new TextField(); 
     openingPriceInput.setPromptText("Opening Price"); 

     //Closing Price input 
     closingPriceInput = new TextField(); 
     closingPriceInput.setPromptText("Closing Price"); 

     //Change in Price Input 
     changeInPriceInput = new TextField(); 
     closingPriceInput.setPromptText("Change in Price"); 

     //Button 
     Button addButton = new Button("Add"); 
     addButton.setOnAction(e -> addButtonClicked()); 
     Button deleteButton = new Button("Delete"); 
     deleteButton.setOnAction(e -> deleteButtonClicked()); 

     HBox hBox = new HBox(); 
     hBox.setPadding(new Insets(10,10,10,10)); 
     hBox.setSpacing(10); 
     hBox.getChildren().addAll(symbolInput, nameInput, openingPriceInput, closingPriceInput, changeInPriceInput, addButton, deleteButton); 

     table = new TableView<>(); 
     table.setItems(getStock()); 
     table.getColumns().addAll(symbolColumn, nameColumn, openingPriceColumn, closingPriceColumn, changeInPriceColumn); 

     VBox vBox = new VBox(); 
     vBox.getChildren().addAll(table, hBox); 

     Scene scene = new Scene(vBox); 
     window.setScene(scene); 
     window.show(); 
    } 

    //Add button clicked 
    public void addButtonClicked(){ 
     Stock Stock = new Stock(); 
     Stock.setSymbol(symbolInput.getText()); 
     Stock.setName(nameInput.getText()); 
     Stock.setOpeningPrice(Double.parseDouble(openingPriceInput.getText())); 
     Stock.setClosingPrice(Double.parseDouble(closingPriceInput.getText())); 
     Stock.setChangeInPrice(Double.parseDouble(changeInPriceInput.getText())); 
     table.getItems().add(Stock); 
     symbolInput.clear(); 
     nameInput.clear(); 
     openingPriceInput.clear(); 
     closingPriceInput.clear(); 
     changeInPriceInput.clear(); 
    } 

    //Delete button clicked 
    public void deleteButtonClicked(){ 
     ObservableList<Stock> StockSelected, allStocks; 
     allStocks = table.getItems(); 
     StockSelected = table.getSelectionModel().getSelectedItems(); 

     StockSelected.forEach(allStocks::remove); 
    } 

    //Get all of the Stocks 
    public ObservableList<Stock> getStock(){ 
     ObservableList<Stock> stocks = FXCollections.observableArrayList(); 
     stocks.add(new Stock("AMZN", "Amazon", 571, 576.4583, 5.4583)); 
     stocks.add(new Stock("EBAY", "eBay", 24.10, 23.7318 , -0.3682)); 
     stocks.add(new Stock("AAPL", "Apple Inc.", 103.91, 104.516, 0.606)); 
     stocks.add(new Stock("SNEJF", "Sony Corp", 24.375, 24.375, 0.00)); 
     stocks.add(new Stock("SBUX", "Starbucks", 58.32, 58.86, 0.54)); 
     return stocks; 
    } 


} 

Controller.java

Dieser den Code für mein Login-Fenster enthält.

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 

public class Controller { 
    @FXML 
    private Label labelStatus; 

    @FXML 
    private TextField textUsername; 

    @FXML 
    private TextField textPassword; 

    public void Login(ActionEvent event) throws Exception { 
     if (textUsername.getText().equals("CS1113") && textPassword.getText().equals("Section011")) { 
      labelStatus.setText("Login is Successful"); 
      Stage primaryStage = new Stage(); 
      Parent root = FXMLLoader.load(getClass().getResource("/sample/Main.fxml")); 
      Scene scene = new Scene(root,400,400); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } else { 
      labelStatus.setText("Login failed!!"); 
     } 
    } 

} 

Die begleitende FXML-Datei.

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

<?import java.lang.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.text.*?> 

<AnchorPane prefHeight="300.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="sample.Controller"> 
    <children> 
    <Button fx:id="buttonLogin" layoutX="113.0" layoutY="224.0" mnemonicParsing="false" text="Login"> 
     <font> 
     <Font size="18.0" fx:id="x1" /> 
     </font> 
    </Button> 
    <TextField fx:id="textUsername" layoutX="50.0" layoutY="68.0" prefWidth="200.0" promptText="username" /> 
    <PasswordField id="txtPassword" fx:id="textPassword" layoutX="50.0" layoutY="150.0" prefWidth="200.0" promptText="password" /> 
    <Label fx:id="labelStatus" font="$x1" layoutX="14.0" layoutY="14.0" prefWidth="272.0" text="Status" textAlignment="LEFT" textFill="#cc0000" /> 
    </children> 
</AnchorPane> 

Ich bin sicher, dass es ein einfacher Weg ist, eine große Menge an meinem Code oder einen einfacheren Weg zu implementieren einige der Methoden oder Funktionen zu implementieren ich geschaffen habe.

Jede Hilfe wird sehr geschätzt.

+0

Die Anwendungsklasse ist der Einstiegspunkt, nicht der Controller. Wenn Sie möchten, dass das Anmeldefenster zuerst angezeigt wird, müssen Sie zuerst die Anmeldung in der 'start'-Methode anzeigen und sicherstellen, dass das Hauptfenster erst angezeigt wird, wenn die Anmeldung erfolgreich war. – fabian

Antwort

0

Ein paar Möglichkeiten, wie Sie das erreichen können. Wenn Sie von einer FXML-Datei laden, laden Sie einen übergeordneten Knoten. Um also von einem Bildschirm zum anderen zu wechseln, können Sie entweder den Parent-Knoten der vorhandenen Szene als neuen Parent-Knoten festlegen oder eine neue Szene basierend auf dem neuen Knoten erstellen und die neue Szene auf der Bühne festlegen der Hauptanwendung. Möglicherweise müssen Sie einige Methoden verfügbar machen, mit denen Sie dies tun können, oder sicherstellen, dass Ihre Bildschirme Zugriff auf die Stage- oder Szenenobjekte haben, die in der Hauptanwendungsklasse erstellt wurden.

Dies ist nicht zu schlecht ein Tutorial, wie Sie eine mögliche Bildschirmverwaltung Aspekt Ihrer JavaFX-Anwendung zu implementieren: https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1. Ich rollte selbst, um für FXML und manuell erstellte Bildschirme zu sorgen, inspiriert von diesem ersten Stich.