2016-04-11 8 views
4

私は地元の大学で「Java 101」クラスを完成させ、初心者のJavaプログラマーです。私はまた、Java FXを含む、いくつかの余分なトピックについて学びたいと思っています。私は、OracleのWebサイトでJava FXのチュートリアルを勉強し、いくつかのYouTubeビデオを見たり、 "Java FX for Dummies"(これは初心者のために見つけた最高の本でした)を読みました。たくさんの基本がありますが、比較的シンプルなものが私を逃してしまいます。2つの異なるJava FXシーンを2つの別々のクラスとして記述できますか?

たとえば、1つのステージで複数のシーンを使用するJava FXプログラムがあるとします。ユーザーが「スイッチ!」ボタンをクリックすると、ボタンを押すと、2番目のシーンが最初のシーンにスワップアウトされます。簡単です。 1つの.javaファイルでこれをすべて実行できますが、問題はありません。 (下のコードを参照してください)

しかし、私の.javaクラスファイルは、トラブルシューティングに本当に長くなって厄介です。 1つのシーンを1つの.javaファイル内の1つのクラスとして定義/宣言/初期化でき、2つ目のシーンを別の.javaファイルの別のクラスとして定義/宣言/これにより、各シーンのコンポーネントをずっと簡単に追跡できるようになります。問題は、私はこれを行う方法を理解できないということです。

Scene1.javaクラスを作成してからScene2.javaクラスを作成し、シーンを切り替えるときに2つのステージオブジェクトを渡すだけでいいと思います。しかし、私はこれがどのように行われたかの例を見つけることができず、すべての試みがコンパイラエラーや本当に恐ろしいランタイムエラーに繋がります。

これはどのように行うことができますか?もしそうなら、以下のSwitchScenes2()メソッドを変更して新しいScene2オブジェクトを作成し、それをステージに渡すにはどうしなければなりませんか?

ありがとうございます! RAO

/* 
    JavaFXExample.java 
*/ 

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.event.*; 
import javafx.geometry.*; 

public class JavaFXExample extends Application{ 

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

Button btnSw1; 
Button btnSw2; 
Button btnClose; 
HBox hbox1; 
VBox vbox1; 
Scene scene1; 
Scene scene2; 
Stage stage; 

@Override public void start(Stage primaryStage){ 
    btnSw1 = new Button("Switch Scenes!"); 
    btnSw1.setOnAction(
     e -> SwitchScenes2()); 
    btnSw2 = new Button("Switch back!"); 
    btnSw2.setOnAction(
     e -> SwitchScenes1()); 
    btnClose = new Button(); 
    btnClose.setText("Close me!"); 
    btnClose.setOnAction(e -> CloseWindowClick()); 

    hbox1 = new HBox(10); 
    hbox1.getChildren().addAll(btnSw1); 
    vbox1 = new VBox(10); 
    vbox1.getChildren().addAll(btnSw2, btnClose); 

    scene1 = new Scene(hbox1, 300, 300); 
    scene2 = new Scene(vbox1, 200, 400); 

    stage = primaryStage; 
    stage.setScene(scene1); 
    stage.setTitle("Example App"); 
    stage.show(); 
    } 

    public void SwitchScenes1(){ 
     stage.setScene(scene1); 
    } 
    public void SwitchScenes2(){ 
     stage.setScene(scene2); 
    } 
    public void CloseWindowClick(){ 
     stage.close(); 
    } 
} 
+0

関連する質問:http://stackoverflow.com/questions/32464698/java-how-do-i-start-a-standalone-application-from-the-current-one-when-both ~are –

答えて

1

ピートを拡張するパブリッククラス、Javaクラスを作成しますレイアウト(HBox、VBox、Flowpaneまたは....)を返す各クラス作成メソッド(関数)で、メインでそのJavaクラスのオブジェクトを作成し、それらのメソッドを使用して大きなアプリケーションを構築します。

私のサンプルでは、​​1つのメインクラスと1つのクラスを1つの関数で作成しました。私のメインで を変更しますボタンのシーンをクリックして2つのlables、2つのボタン1つのレイアウトと分離クラスの一つのオブジェクトを、そこにある私のメイン:

public class SwitchSceneSample extends Application { 
public static void main(String[] args) { 
    launch(args); 
} 

Stage window; 
Scene scene1, scene2; 

@Override 
public void start(Stage primaryStage) throws Exception { 
    // I am using window as primaryStage 
    window = primaryStage; 
    // Label 1 
    Label label1 = new Label("Welcome to the first scene!"); 
    // Label 2 
    Label label2 = new Label("This is second scene!"); 
    // Button 1, by pressing this button primaryStage will be set as scene 2 
    Button button1 = new Button("Go to scene 2"); 
    button1.setOnAction(e -> window.setScene(scene2)); 
    // Button 2, by pressing this button primaryStage will be set as scene 1 
    Button button2 = new Button("Click to go scene 1"); 
    button2.setOnAction(e -> window.setScene(scene1)); 
    // Creating an object of the class'LayoutOne.java' 
    LayoutOne l1 = new LayoutOne(); 
    // set my scene 1(by calling method called 'sceneView1()' from class 'LayoutOne.java') 
    scene1 = new Scene(l1.sceneView1(label1, button1), 200, 200); 
    // Set my scene 2 inside my main class 
    StackPane layout2 = new StackPane(); 
    layout2.getChildren().addAll(label2, button2); 
    scene2 = new Scene(layout2, 600, 300); 
    // Making my 
    window.setScene(scene1); 
    window.setTitle("Scene Switch Sample"); 
    window.show(); 
} 

}

マイセカンドクラス:

public class LayoutOne { 
public VBox sceneView1(Label label, Button button) { 

    // Layout 1 - children are laid out in vertical column 
    VBox layout1 = new VBox(20); 
    layout1.getChildren().addAll(label, button); 

    return layout1; 
} 

}

1

あなたがしたいことは、どちらもシーンを返す関数を持つ別のクラスを作成することです。そこから、これらのクラスを初期化し、ボタンを使ってこれらのシーンにデータを追加するか、新しい空のシーンを作成する関数を呼び出すことができます(シーンを簡単に削除する)。しかし、このようなシーンをよりプロフェッショナルな方法で切り替えるには、TabPane()をチェックアウトする必要があります。

Scene1 scene1 = new Scene1(); 
Scene2 scene2 = new Scene2(); 

TabPane tabPane = new TabPane(); 
Tab tab1 = new Tab(); 
tab1.setContent(scene1); 
tabPane.getTabs().add(tab1); 
Tab tab2 = new Tab(); 
tab2.setContent(scene2); 
tabPane.getTabs().add(tab2); 
1
  1. 最初の画面を初期化& mainメソッドが含まれているマネージャークラスを作成します。例えば。

パブリッククラスVMCSManagerアプリケーション{

private Parent content; 
private static VMCSManager instance; 

public VMCSManager() { 
    instance=this; 
} 

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

public static VMCSManager getInstance() { 
    return instance; 
} 

@Override 
public void start(Stage primaryStage) throws Exception {  
    initializePanel(); 
    Scene scene = new Scene(content); 
    stageStyle(primaryStage); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private void initializePanel() throws IOException{ 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("fxml/SimulatorDisplay.fxml")); 
    content = loader.load(); 
} 

public void openCustomerPanel() throws IOException{ 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("fxml/CustomerDisplay.fxml")); 
    content = loader.load(); 
    Scene scene = new Scene(content); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

を}延び

  • 最初の画面用のメインコントローラクラスを作成します。例えば;
  • パブリッククラスSimulatorControllerが初期化可能{

    @FXML 
    public void clickCustomer (ActionEvent event) throws IOException{ 
        log.info("Starting Customer Panel"); 
        VMCSManager.getInstance().openCustomerPanel(); 
    } 
    @FXML 
    public void clickMaintainer(ActionEvent event) throws IOException{ 
        log.info("Starting Maintainer Panel"); 
        VMCSManager.getInstance().openMaintainerPanel(); 
    } 
    

    }

    を実装
  • 最後に指定された画面のためのコントローラクラスを作成します。eg`
  • 私はあなたが小さなファイルに一つの大きなjavaファイルを分離したい理解しCustomerControllerがSimulatorController {

    @FXML 
    private Label brand1Lbl; 
    @FXML 
    private Label brand2Lbl; 
    @FXML 
    private Label brand3Lbl; 
    @FXML 
    private Label brand4Lbl; 
    @FXML 
    private Label brand5Lbl; 
    
    @FXML 
    private Label statusLbl1; 
    @FXML 
    private Label statusLbl2; 
    
    private static final Logger log=LoggerFactory.getLogger(CustomerController.class); 
    
    public CustomerController() { 
        context= new BuyingStateContext(); 
    } 
    
    public void initialize(URL location, ResourceBundle resources) { 
        this.location = location; 
        this.rb = resources; 
        coinsValidityFlash.setVisible(false); 
        insertCoinTxt.setDisable(true); 
    
        brand1Btn.setStyle("-fx-background-color: #CACACA;"); 
        brand2Btn.setStyle("-fx-background-color: #CACACA;"); 
        brand3Btn.setStyle("-fx-background-color: #CACACA;"); 
        brand4Btn.setStyle("-fx-background-color: #CACACA;"); 
        brand5Btn.setStyle("-fx-background-color: #CACACA;"); 
    
        populateVending(); 
    } 
    . 
    . 
    . 
    

    }

    `

    関連する問題