JavaFX 多个初级阶段
JavaFX Multiple Primary Stages
我正在将我的 Swing 应用程序转换为 JavaFX。我将核心和 UI 与核心和 Window 对象分开。好的是我可以在同一个核心上创建两个 windows 和 link。一个 window 中的任何更新更新核心,然后更新另一个 window:
Core core = new Core();
Window window1 = new Window(core); //Extends JFrame
Window window2 = new Window(core);
我想做的是在转换为 JavaFX 时保持同样的想法。我是 JavaFX 的新手,所以我不太了解它,尤其是阶段和场景。据我所知,start 方法传递了一个我必须使用的 Stage 对象。这改变了我的系统,所以要创建第二阶段我需要另一个系统。
我可以创建自己的 class 来扩展 Stage,然后将 Core 对象传递给它吗?
我会将核心对象传递给节点子类型,而不是舞台。
这是一个在不同阶段的节点之间共享 "core"(在本例中为点击计数器)的示例(摘自:JavaFx: Pass Value to another class and update Label text)。
在此示例中,一个阶段对核心进行更改(增加点击计数器)。另一个阶段有元素绑定到核心(这样当点击计数器被第一阶段改变时,第二阶段的标签会自动更新以反映新的点击计数值)。
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。
我正在将我的 Swing 应用程序转换为 JavaFX。我将核心和 UI 与核心和 Window 对象分开。好的是我可以在同一个核心上创建两个 windows 和 link。一个 window 中的任何更新更新核心,然后更新另一个 window:
Core core = new Core();
Window window1 = new Window(core); //Extends JFrame
Window window2 = new Window(core);
我想做的是在转换为 JavaFX 时保持同样的想法。我是 JavaFX 的新手,所以我不太了解它,尤其是阶段和场景。据我所知,start 方法传递了一个我必须使用的 Stage 对象。这改变了我的系统,所以要创建第二阶段我需要另一个系统。
我可以创建自己的 class 来扩展 Stage,然后将 Core 对象传递给它吗?
我会将核心对象传递给节点子类型,而不是舞台。
这是一个在不同阶段的节点之间共享 "core"(在本例中为点击计数器)的示例(摘自:JavaFx: Pass Value to another class and update Label text)。
在此示例中,一个阶段对核心进行更改(增加点击计数器)。另一个阶段有元素绑定到核心(这样当点击计数器被第一阶段改变时,第二阶段的标签会自动更新以反映新的点击计数值)。
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。