Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX将值传递到视图实例中,而不使用静态setter_Java_Javafx - Fatal编程技术网

JavaFX将值传递到视图实例中,而不使用静态setter

JavaFX将值传递到视图实例中,而不使用静态setter,java,javafx,Java,Javafx,我正在从我的主类启动一个JavaFX视图,我想向该视图的实例传递一个值。目前,我在视图类中使用静态成员变量,但如果可能的话,我希望避免使用静态 主类 import javafx.application.Application; public class Main { public static void main(String[] args) { int value = 3; View.setValue(value); Appli

我正在从我的主类启动一个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;
    }
}
查看类

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;
    }
}
有没有更好的方法来做到这一点,即避免使用静态成员变量或在视图类中创建具有参数value的launch()方法

提前谢谢

编辑:
我只是想澄清一下,因为我在最初的帖子中遗漏了(我的坏消息,我知道),我想要传递的实际“值”是MBassador事件总线(即MBassador总线)的一个实例,否则,您的所有答案都会非常有效

是的,更好的方法是提供您的值作为程序的参数,然后从start方法获取值作为下一步:

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");
        }
    }
@Override
public void init() throws Exception {
    MBassador obj = Main.getMBassador();
    ...
}
最后启动您的程序,并将您的论点作为下一步:

java Main 2
如果您不想将其作为参数提供给java程序,请将其放入 使用
Application.launch(newview().getClass(),“2”)对主方法进行int

响应更新

您想要实现的目标无法正确完成,因为我们无法干预JavaFX如何创建您的
应用程序
,我们只能提供上面解释的字符串参数

您的方法是一个很好的解决方法,但是如果您只需要启动一个应用程序,那么您也可以使用
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();
    }
}
从手册:

典型用法是:

 public static void main(String[] args) {
     Application.launch(MyApp.class, args);
 }
您不应该自己创建应用程序<代码>应用程序。启动
将创建给定类的对象,然后启动它。
您只需通过
args
传递参数,然后使用
getParameters()

在应用程序类中访问它们即可。您不能:除了从该实例本身中之外,您不能获取对由launch方法创建的
application
子类实例的引用。你想做的并没有什么意义:在JavaFX应用程序中,你应该考虑<代码> Stand()>代码>方法——而不是<代码>主体()>代码>方法——作为应用程序的入口点。(JavaFX应用程序甚至不需要
main()
方法。)如果我想传入一个不能从字符串中很好地解析的参数,您建议如何执行此操作?我在考虑类似MBassador的东西,不幸的是它没有一个好的.parseX()方法与之关联。我不知道你的类,也许你可以提供JSON格式的字符串?或者只提供参数来再次创建这个object的实例,就像我在问题下面的评论中所说的那样,这样做的方法是将初始化直接移动到
start()
方法。不要在
main()
中初始化内容。作为参考,MBassador是一个事件总线,我无法在视图中创建总线实例,因为它必须与main中使用的实例相同(main还将实例传递到其他类中)。我认为JSON不可能出于同样的原因,可能应该提到“值”实际上不是我想要传递的类型