2015-04-03 115 views
0

我將我的Swing應用程序轉換爲JavaFX。我有核心和用Core和Window對象分開的用戶界面。好的是我可以創建兩個窗口並將它們鏈接到同一個核心。在一個窗口中的任何更新更新核心,然後更新其他窗口:JavaFX多個初級階段

Core core = new Core(); 
Window window1 = new Window(core); //Extends JFrame 
Window window2 = new Window(core); 

我想這樣做的是保持這種相同的想法,當我轉換爲JavaFX的。我是一個擁有JavaFX的新人,所以我不太瞭解它,尤其是舞臺和場景。從我所知道的情況來看,start方法有一個我必須使用的Stage對象。這改變了我的系統,所以要創建第二個階段,我需要另一個系統。

我可以創建自己的類來擴展Stage,然後將一個Core對象傳遞給它嗎?

+0

JavaFx對這類事情有fxml。您可以使用scenebuilder並附加一個控制器,您可以使用它來控制所有應用程序窗口。我對它並不熟悉,但我知道它在正確的方向。 – WonderWorld 2015-04-03 22:40:38

+1

是的,您可以創建一個擴展Stage並將Core對象傳遞給它的類。 – ItachiUchiha 2015-04-04 04:23:36

回答

4

我會將核心對象傳遞給節點子類型,而不是舞臺。

以下是在不同階段的節點之間共享「核心」(本例中爲點擊計數器)的示例(採用自:JavaFx: Pass Value to another class and update Label text)。

在本示例中,一個階段對核心進行了更改(增加了點擊計數器)。另一個階段具有綁定到核心的元素(以便在第一階段更改點擊計數器時,第二階段中的標籤會自動更新以反映新的點擊計數值)。

sharedinfo

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.*; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class Clicker extends Application { 

    @Override 
    public void start(Stage inputStage) throws Exception { 
     final ClickCounter clickCounter = new ClickCounter(); 

     final ClickInputView inputView = new ClickInputView(clickCounter); 
     final ClickOutputView outputView = new ClickOutputView(clickCounter); 

     inputStage.setScene(new Scene(inputView)); 
     inputStage.show(); 

     Stage outputStage = new Stage(); 
     outputStage.initOwner(inputStage); 
     outputStage.initStyle(StageStyle.UTILITY); 
     outputStage.setScene(new Scene(outputView)); 
     outputStage.setX(inputStage.getX()); 
     outputStage.setY(inputStage.getY() + inputStage.getHeight()); 
     outputStage.show(); 
    } 

    private class ClickCounter { 
     private final ReadOnlyIntegerWrapper numClicks = 
       new ReadOnlyIntegerWrapper(0); 

     public int getNumClicks() { 
      return numClicks.get(); 
     } 

     public ReadOnlyIntegerProperty numClicksProperty() { 
      return numClicks.getReadOnlyProperty(); 
     } 

     public void click() { 
      numClicks.set(getNumClicks() + 1); 
     } 
    } 

    private class ClickInputView extends StackPane { 
     private final Button button = new Button("Click Me!"); 

     public ClickInputView(ClickCounter clickCounter) { 
      button.setOnAction(event -> clickCounter.click()); 
      setPadding(new Insets(10)); 

      getChildren().setAll(button); 
     } 
    } 

    private class ClickOutputView extends StackPane { 
     private final Label clickCountLabel = new Label(); 

     public ClickOutputView(ClickCounter clickCounter) { 
      clickCountLabel.textProperty().bind(
        Bindings.format(
          "Clicked %d times", 
          clickCounter.numClicksProperty() 
        ) 
      ); 
      clickCountLabel.setMinWidth(150); 
      clickCountLabel.setAlignment(Pos.CENTER); 
      setPadding(new Insets(10)); 

      getChildren().setAll(clickCountLabel); 
     } 
    } 

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

如果你想要做這類事情與FXML就有點有點棘手,你需要做的東西,如:Passing Parameters JavaFX FXML