javafx将视图的实例传递值,而无需使用静态设置器



我正在从我的主类启动一个Javafx视图,我想将值传递给该视图的实例。目前,我正在视图类中使用静态成员变量,但是如果可能的话,我想避免静态。

主类

import javafx.application.Application;
public class Main
{
    public static void main(String[] args)
    {
        int value = 3;
        View.setValue(value);
        Application.launch(new View().getClass());
    }
}

查看类

import javafx.application.Application;
import javafx.stage.Stage;
public class View extends Application
{
    private static int value;
    @Override
    public void start(Stage arg0) throws Exception
    {
        // TODO Auto-generated method stub
    }
    public static int getValue()
    {
        return value;
    }
    public static void setValue(int valueIn)
    {
        View.value = valueIn;
    }
}

是否有更好的方法来避免使用静态成员变量或在视图类中创建具有值的参数的启动()方法?

预先感谢。

编辑:只是为了澄清我从原始帖子中省略的(我知道我知道),我想通过的实际"值"是MBASSADOR事件总线的一个实例(即MBASSADOR BUS),否则您的所有答案都可以使用完美

来自手动:

https://docs.oracle.com/javase/8/javafx/api/javafx/application/application.html

典型用法是:

 public static void main(String[] args) {
     Application.launch(MyApp.class, args);
 }

您不应该自己创建应用程序。Application.launch将创建给定类的对象,然后启动它。您可以简单地通过args传递参数,然后在您的应用程序类中访问getParameters()

是的,一种更好的方法是提供您的价值作为程序的参数,然后从开始方法获取它:

public class View extends Application {
    private int value;
    public void start(Stage stage) {
        List<String> unnamedParams = getParameters().getUnnamed();
        if (unnamedParams.size() > 0) {
            this.value = Integer.parseInt(unnamedParams.get(0));
        } else {
            throw new IllegalStateException("No argument has been provided");
        }
    }

然后您的Main类是:

public class Main
{
    public static void main(String[] args)
    {
        Application.launch(new View().getClass(), args);
    }
}

最终以您的论点启动您的程序:

java Main 2

如果您不想将其作为Java程序的参数提供int使用Application.launch(new View().getClass(), "2");

的主要方法

响应更新

您想实现的目标无法正确完成,因为我们无法干预Javafx如何创建您的Application,我们唯一能提供的是如上所述的字符串参数。

您的方法是一个很好的解决方法,但是如果您只需要启动一个应用程序,则还可以使用 ThreadLocal来存储临时对象,直到您从init方法获取它,因为它是调用唯一的方法线程。

public class Main
{
    private static final ThreadLocal<MBassador> THREAD_LOCAL = new ThreadLocal<>();
    public static void main(String[] args)
    {
        THREAD_LOCAL.set(myObject)
        try {
            Application.launch(new View().getClass(), args);
        } finally {
            THREAD_LOCAL.remove();
        }
    }
    public static MBassador getMBassador() {
        return THREAD_LOCAL.get();
    }
}

然后,您可以从Init方法中的应用程序中获取它:

@Override
public void init() throws Exception {
    MBassador obj = Main.getMBassador();
    ...
}