gpt4 book ai didi

java - javafx 应用程序实例化后,如何更改其变量值?

转载 作者:行者123 更新时间:2023-11-30 08:01:23 28 4
gpt4 key购买 nike

我正在尝试创建一个可用于 future 项目的通用类。它只是制作一个简单的 javafx 浏览器。我遇到的问题是我希望能够动态更改某些属性(在实例化时)。我添加了一些简单的 setter ,希望它能完成工作,但它们不起作用。有没有办法在执行 start() 后更改变量?

类代码:

package rob.rushton;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class RushBrowser extends Application {

public RushBrowser() {}

private String url = "www.google.com";
private final String fullUrl = "http://" + url;
String title = "Simple Browser";
private int height = 750;
private int width = 750;

public void openBrowser() {
launch();
}

public void setURL(String u) {
url = u;
}

public void setHeightWidth(int h, int w) {
height = h;
width = w;
}

public void setTitle(String t) {
title = t;
}

@Override
public void start(Stage stage) {
stage.setTitle(this.title);
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, width, height);
WebView browser = new WebView();
WebEngine engine = browser.getEngine();
engine.load(fullUrl);
pane.setCenter(browser);
stage.setScene(scene);
stage.show();
}
}

我试图像这样运行它:

package rushtest;

import rob.rushton.RushBrowser;

public class RushTest {

public static void main(String[] args) {
RushBrowser rush = new RushBrowser();
rush.setTitle("Test Title");
rush.setURL("www.github.com");
rush.setHeightWidth(1000, 1000);
rush.openBrowser();
}
}

编辑:(8/9/15)下面列出的建议都不起作用:(问题是我不知道如何访问由 launch() 启动的应用程序线程

最佳答案

您应该使这些属性成为真正的 JavaFX 属性,或者将它们的 setter 委托(delegate)更新为实际的 UI 对象。一些粗略的代码 - 仅显示相关部分:

真实 JavaFX 属性的情况:

public class RushBrowser extends Application {

...
private StringProperty titleProperty = new SimpleStringProperty("Simple Browser");
...

public void setTitle(String t) {
titleProperty.set(t);
}

@Override
public void start(Stage stage) {
stage.titleProperty().bind(this.titleProperty);
...
}
}

授权的情况 - 您还必须保留Stage的引用:

public class RushBrowser extends Application {

...
private Stage primaryStage;
// no need to keep the title member variable
...

public void setTitle(String t) {
primaryStage.setTitle(t);
}

@Override
public void start(Stage stage) {
this.primaryStage = stage;
...
}
}
<小时/>

编辑

根据 James_D 的评论,还有一个问题:main 方法没有引用 Application.launch() 创建的实例。 。所以:

  1. 如果您想在应用程序启动之前自定义其参数,您可以覆盖 Application.init() :

    public class SpecialRushBrowser extends RushBrowser {
    public void init() {
    this.setTitle("Test Title");
    ...
    }
    }

    或者来自测试代码:

    public class RushTest {
    static class TestRushBrowser extends RushBrowser {
    public void init() {
    super.init(); // just in case
    this.setTitle("Test Title");
    ...
    }
    }

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

    如果您以后不需要修改这些参数,则可以保留代码不变(即不需要 JavaFX 属性)。否则,应用上述更改。

  2. 如果您想在应用程序启动后更改参数,则需要提供 RushBrowser 的实际实例的引用。创建者 Application.launch()到将执行更改的代码。一种简单但肮脏的方法是使用全局变量:

    public class RushBrowser extends Application {
    public static RushBrowser INSTANCE;

    public void init() {
    INSTANCE = this;
    }

    ...
    }

    然后从 launch() 之后运行的任何代码:

    RushBrowser.INSTANCE.setTitle(...);
    ...

    由于全局状态通常很危险,因此如果应用程序变得更加复杂,您可能需要尝试使用依赖项注入(inject)框架。即使使用 DI,它也可能会变得棘手,因为主类仍然是从 JavaFX 创建的,在 DI 框架之外 - 但那是另一个故事了。

    您需要再次应用编辑上方的更改。

关于java - javafx 应用程序实例化后,如何更改其变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31869655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com