【问题标题】:JavaFX : invoking ' Application.launch(args) ' from a method other than main [duplicate]JavaFX:从main以外的方法调用'Application.launch(args)'[重复]
【发布时间】:2015-03-19 16:45:56
【问题描述】:

问题

我可以调用'Application.launch(args); ' 来自 main 以外的方法?如果是这样,您能否提供一个示例,牢记以下上下文?

背景

我正在构建一个学习/教学、命令/文本应用程序,用于向用户介绍数组。在主类结束时,在主要应用程序内容运行完毕后,我调用'ViewSiteOrExit.viewSitePromptPuSVM(); ',这让用户反对:打开阵列上的 Oracle 页面,或者退出游戏。

如果用户希望查看 Oracle 页面,我调用 ' OpenSite.??????????(); ',这将在 FX VBox 中打开页面。如果没有,请退出。

这是我第一次使用 FX,我很累,所以任何意见和建议,我的代码都会非常有帮助,因为我可能会遗漏一些东西。

但我的主要问题是我如何/应该如何调用 ' OpenSite.??????????(); ',包含'Application.launch(args);的方法,如果不是来自我的main?

如果必须从 main 调用它,我该怎么做,只有在应用程序的主要部分运行之后,并且只有在用户输入'y'的情况下?

下面是提示用户查看站点或退出游戏的.java,以及打开页面的.jave。

package mrArray;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class OpenSite extends Application 
{
    VBox vBoxOF = new VBox();

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

  @Override
  public void start(Stage primaryStage) 
  {
    vBoxOF.setId("root");

    WebView  webViewBrowserOL = new WebView();
    WebEngine webEngineOL = webViewBrowserOL.getEngine();
    String urlSL = "http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html";
    webEngineOL.load(urlSL);

    vBoxOF.setPadding(new Insets(30, 50, 50, 50));
    vBoxOF.setSpacing(10);
    vBoxOF.setAlignment(Pos.CENTER);
    vBoxOF.getChildren().addAll(webViewBrowserOL);

    Scene sceneOL = new Scene(vBoxOF);
    primaryStage.setScene(sceneOL);
    primaryStage.show();
  }
}

二等

package mrArray;


public class ViewSiteOrExit 
{
    /*
     * declare fields,
     */
    private static int statePrSIF;
    private static String enterYOrNPrSSOF;

    /*
     * declare method,
     * initialize field,
     * while, test(field) is passing execute,
     * switch, evaluates cases with value(field),
     * matching, execute statements,
     * 0, first case, prompt, y drop to if, reset value, use app again,
     * n drop to else, increment field, 1, second case,
     * invoke method to close app, reset field value to prevent double field invocation,
     * return flow to caller to prevent use of closing Scanner,
     */
     public static void viewSitePromptPuSVM() 
     {
         statePrSIF = 0;
         while (statePrSIF < 2) 
         {
             switch (statePrSIF) 
             {
                case 0: 
                    System.out.println();
                    System.out.println("[:-)] One more question?");
                    System.out.println("Would you like to see what Oracle has to say about me?");
                    System.out.println("Enter ' y ' for yes.");
                    System.out.println("Enter ' n ' for no.");
                    break;
                case 1:
                    goodByePuSVM();
                    statePrSIF = 0;
                    return;
             }

             enterYOrNPrSSOF = MrArray.scannerOF.next();

             if(enterYOrNPrSSOF.equalsIgnoreCase("y")) 
             {
                 statePrSIF = 0;
                 System.out.println("[:-)] Well bud, it's been fun.");
                 System.out.println("Here is that Orcale thing.");
                 System.out.println("See ya later!");
                 OpenSite.??????????();
             }
             else if(enterYOrNPrSSOF.equalsIgnoreCase("n")) 
             {
                 statePrSIF++;
             }  
         }
     }

     /*
      * declare method,
      * invoke methods, display output,
      * close Scanner, terminate,
      */
     public static void goodByePuSVM()
     {
            System.out.println("[:-)] Well bud, it's been fun.");
            System.out.println("See ya later!");

            MrArray.scannerOF.close();
     }
}

【问题讨论】:

标签: java oracle javafx main invoke


【解决方案1】:

您需要调用扩展应用程序的类的静态方法。您可以从任何地方调用它,而不是必须从 main( ) 调用它。使用以下内容:

OpenSite.launch(OpenSite.class);

有关 JavaFX 应用程序如何工作的背景知识,请通过Application JavaDoc。它写得非常好,并且对 JavaFX 应用程序的触发方式提出了很多见解。

你也可以通过下面的回答

Starting JavaFX from Main method of class which doesn't extend Application

备注

  • 调用 Application.launch() 并启动 primary Stage 的线程不会返回,除非舞台关闭。
  • 确保您只需一次致电launch()

【讨论】:

  • 是的,它会的。请检查我的编辑。
  • 我会的,我会的。我假设我可以调用: OpenSite.launch(OpenSite.class);从任何地方/任何方法,结果相同?我实现了您建议的新调用,它是一个大型应用程序,因此需要一分钟,但它正在运行/我现在正在测试它。
  • 你可以使用CodeReview
  • 如果我的主要应用程序类中有一个 main()(现在已经设置)、MrArray 和我的 OpenSite 类中有一个 main(),会不会有冲突?如果我必须调用 Application.launch(),应该如何安排我对 OpenSite.launch(OpenSite.class) 的调用?
  • 为什么在 OpenSite 类中需要 main()?我不明白你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2014-02-22
相关资源
最近更新 更多