JavaFX将值传递到视图实例中,而不使用静态setter
我正在从我的主类启动一个JavaFX视图,我想向该视图的实例传递一个值。目前,我在视图类中使用静态成员变量,但如果可能的话,我希望避免使用静态 主类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
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不可能出于同样的原因,可能应该提到“值”实际上不是我想要传递的类型