如何将参数传递给JavaFX应用程序?

fer*_*rck 13 java parameters javafx

我正在运行我的JavaFX应用程序:

public class MainEntry {
    public static void main(String[] args) {
        Controller controller = new Controller();
        Application.launch(MainStage.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

MainStage课程延伸Appication.Application.launch在一个特殊的FX线程中启动我的JavaFX窗口,但在我的main方法中,我甚至没有我的MainStage类的实例.

如何将非String参数(在我的情况下为控制器)传递给MainStage实例?这是一个有缺陷的设计吗?

dmo*_*ony 7

这是我在别处找到的一个很好的例子

@Override
public void init () throws Exception
{
  super.init ();

  Parameters parameters = getParameters ();

  Map<String, String> namedParameters = parameters.getNamed ();
  List<String> rawArguments = parameters.getRaw ();
  List<String> unnamedParameters = parameters.getUnnamed ();

  System.out.println ("\nnamedParameters -");
  for (Map.Entry<String, String> entry : namedParameters.entrySet ())
    System.out.println (entry.getKey () + " : " + entry.getValue ());

  System.out.println ("\nrawArguments -");
  for (String raw : rawArguments)
    System.out.println (raw);

  System.out.println ("\nunnamedParameters -");
  for (String unnamed : unnamedParameters)
    System.out.println (unnamed);
}
Run Code Online (Sandbox Code Playgroud)


fab*_*ian 6

从JavaFX 9开始,您可以使用公共API来“手动”触发JavaFX平台的启动。唯一的缺点是该stop方法的调用方式与通过Application.launch以下方式启动的应用程序不同:

public class MainEntry {
    public static void main(String[] args) {
        Controller controller = new Controller();

        final MainStage mainStage = new MainStage(controller);
        mainStage.init();

        Platform.startup(() -> {
            // create primary stage
            Stage stage = new Stage();

            mainStage.start(stage);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Runnable传递到Platform.startup被调用JavaFX应用程序线程。


isn*_*bad 5

通常,除了传递给main的程序参数之外,不需要将参数传递给主应用程序.人们想要这样做的唯一原因是创建一个可重用的Application.但Application它不需要是可重用的,因为它是组装应用程序的代码片段.想想start新方法main吧!

因此,应用程序本身应该是配置程序并使用可重用的组件在方法中构建应用程序,而不是编写Applicationmain方法中配置的可重用项start,例如:

public class MyApplication extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        // Just on example how it could be done...
        Controller controller = new Controller();
        MyMainComponent mainComponent = new MyMainComponent(controller);
        mainComponent.showIn(stage);
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • _“唯一的原因......是创建一个可重用的应用程序”_我认为还有其他原因,比如当你想要一个非 fx 应用程序启动`Application`(例如添加到现有应用程序的 fx gui)。这样做时,非外汇应用程序需要将信息传递给“应用程序”。 (6认同)