2016-03-18 15 views
0

私はJavaFXの新機能を使用しています。今週は小さなチュートリアルや構文を学ぶサンプルプロジェクトから知識を得て始めました。私は、情報を追加したり削除したり、このプログラムへのログインウィンドウを実装したりするための簡単な在庫情報テーブルを作成しました。私はログインウィンドウを作成しましたが、私の主な機能に適切に実装する方法は不明です。JavaFX - メインウィンドウにログインウィンドウを挿入する

Main.java

これには、在庫アプリケーション用のコードが含まれています。

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

これは私のログインウィンドウのためのコードが含まれています。

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!!"); 
     } 
    } 

} 

添付のFXMLファイル。

<?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> 

大量のコードを実装したり、作成したメソッドや関数を実装するための簡単な方法があることは確かです。

ご協力いただきまして誠にありがとうございます。

+0

アプリケーションクラスは、コントローラではなくエントリポイントです。ログインウィンドウを最初に表示するには、最初に 'start'メソッドでログインを表示し、ログインが成功するまでメインウィンドウを表示しないようにしなければなりません。 – fabian

答えて

0

これを実現する方法はいくつかあります。 FXMLファイルからロードするときは、親ノードをロードしています。したがって、あるスクリーンから別のスクリーンにスワップするには、既存のシーンのParentノードを新しいParentノードに設定するか、新しいノードに基づいて新しいSceneを作成し、ステージ上に新しいシーンを設定することができます主なアプリケーションのこれを行うメソッドを公開するか、メインアプリケーションクラスで作成されたステージオブジェクトまたはシーンオブジェクトに画面からアクセスできるようにする必要があります。

これは、JavaFXアプリケーションに可能な画面管理の側面を実装する方法のチュートリアルではありません。https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1。私はFXMLを手に入れるために自分自身を巻いて、この最初の刺し傷に触発された手動でスクリーンを作りました。

関連する問題