首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX多初级阶段

JavaFX多初级阶段
EN

Stack Overflow用户
提问于 2015-04-03 22:25:35
回答 1查看 1.9K关注 0票数 0

我正在将我的Swing应用程序转换为JavaFX。我有核心和UI分离的核心和窗口对象。更好的是,我可以创建两个窗口并将它们连接到同一个核心。一个窗口中的任何更新都更新核心,然后更新另一个窗口:

代码语言:javascript
复制
Core core = new Core();
Window window1 = new Window(core); //Extends JFrame
Window window2 = new Window(core);

当我转换到JavaFX时,我想要做的是保持同样的想法。我是JavaFX的新手,所以我不太了解它,特别是舞台和场景。据我所知,start方法传递了一个我必须使用的Stage对象。这改变了我的系统,所以要创建第二阶段,我需要另一个系统。

我可以创建自己的类来扩展Stage,然后将一个Core对象传递给它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-04 08:49:35

我会把核心对象传递给一个节点子类型,而不是这个阶段。

下面是一个在不同阶段的节点之间共享“核心”(在本例中是单击计数器)的示例(采用于:JavaFx: Pass Value to another class and update Label text)。

在此示例中,有一个阶段对核心进行更改(增加单击计数器)。另一个阶段有绑定到核心的元素(这样,当第一阶段更改了单击计数器时,第二阶段中的标签就会自动更新以反映新的单击计数值)。

代码语言:javascript
复制
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之类的事情。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29440493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档