2015-04-03 2 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, поэтому я не очень понимаю его, особенно Stages и Scenes. Из того, что я могу сказать, метод start имеет объект Stage, который я должен использовать. Это меняет мою систему, поэтому для создания второго этапа мне нужна другая система.

Могу ли я создать свой собственный класс, который расширяет Stage, а затем передает ему объект Core?

+0

В JavaFx есть fxml для такого рода вещей. Вы можете использовать scriptbuilder и подключить контроллер, который вы можете использовать для управления всеми окнами приложений. Я не знаком с этим, но знаю его в правильном направлении. – WonderWorld

+1

Да, вы можете создать класс, который расширяет Stage, а затем передает ему объект Core. – ItachiUchiha

ответ

4

Я передал бы основной объект узлу подтипа, а не Stage.

Ниже приведен пример совместного использования «ядра» (в данном случае счетчика кликов) между узлами на отдельных этапах (принята от: 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.

Смежные вопросы