2016-09-28 6 views
1

私は次のコードを試して、ViewerというJavaFxアプリケーションを、launchというメソッドを直接呼び出さずに起動させました。なぜJavaFxアプリケーションを独自のクラスから起動する必要がありますか?

Exception in thread "main" java.lang.RuntimeException: Error: class Freelance.Test is not a subclass of javafx.application.Application 
    at javafx.application.Application.launch(Application.java:254) 
    at Freelance.Test.main(Test.java:8) 
:私は次のエラーを取得する

package Freelance; 

public class Test 
{ 

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

} 

を:私はそうのような別のクラスからこれを起動しようとすると、今

package Freelance; 

public class Viewer extends Application 
{ 
    private WebEngine myWebEngine; 

    public void start(Stage stage) 
    { 
     stage.setTitle("Browser"); 

     WebView myBrowser = new WebView(); 
     myWebEngine = myBrowser.getEngine(); 
     myWebEngine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Throwable> observableValue, Throwable oldException, 
        Throwable exception) 
      { 
       System.out.println("WebView encountered an exception loading a page: " + exception); 
      } 
     }); 
     myBrowser.setPrefSize(1600, 900); 

     BorderPane root = new BorderPane(); 
     root.setCenter(myBrowser); 
     stage.setScene(new Scene(root)); 
     stage.show(); 
     myWebEngine.load("http://www.google.com/"); 

    } 

    public static void run() 
    { 
     launch(""); 
    } 

} 

:ここ

は、JavaFXのクラスです

しかし、Testクラスを次のように変更した場合:

package Freelance; 

public class Test 
{ 

    public static void main(String[] args) 
    { 
     Viewer.run(); // Changed from using "launch()" to "run()" 
    } 

} 

次に、正しく動作して起動します。

私はちょうどこれがなぜ起こるのか、あるいは間違ったフォーマットでコードを書いているのか不思議でした。

ありがとうございます。

+0

docuはかなり役に立ちます。 'launch()'メソッドを使う正しい方法について説明しています。 [ここ](https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application)を確認してください。html) – AntJavaDev

+1

ところで、 'args'を空の文字列や空の配列ではなく' launch'メソッドに渡すべきです。 JavaFXはそれらを[アプリケーションパラメータ](http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html#getParameters--)で利用できるようにします。 – VGR

答えて

1

を行うことができます

、あなたはこのコードを見つけますスタックトレース。これは、start()メソッドを提供するクラス内からlaunch(String... args)メソッドを呼び出す必要があることを意味します。

fabianJames_Dの回答は、別のクラスでJavaFXアプリケーションフォームを起動する方法の例を示しています。

+0

ありがとうございます。それは良いディテールです。 –

6

launchは静的メソッドであるため、アプリケーションクラスは

Application.launch(""); 

Viewer.launch(""); 

としてバイトコードに同じ終わるコンパイル後ので、スタックを検査する以外の手段によって決定することができませんスタックの検査は、Applicationクラスをスタックのどこかに見つけることができれば、launchApplicationクラスから呼び出す必要があるのはこのためです。
あなたはthe overloaded version of the launch methodApplicationクラスを渡すことができます:

Application.launch(Viewer.class, ""); 
+0

私は参照してください。下の@ Turing85の詳細を今すぐ理解してください。 –

4

It doesn'tApplicationサブクラス内から起動する必要が

しかし、代替があります。以上見てのとおり

public static void launch(String... args) { 
    // Figure out the right class to call 
    StackTraceElement[] cause = Thread.currentThread().getStackTrace(); 

    boolean foundThisMethod = false; 
    String callingClassName = null; 
    for (StackTraceElement se : cause) { 
     // Skip entries until we get to the entry for this class 
     String className = se.getClassName(); 
     String methodName = se.getMethodName(); 
     if (foundThisMethod) { 
      callingClassName = className; 
      break; 
     } else if (Application.class.getName().equals(className) 
       && "launch".equals(methodName)) { 

      foundThisMethod = true; 
     } 
    } 

    if (callingClassName == null) { 
     throw new RuntimeException("Error: unable to determine Application class"); 
    } 

    try { 
     Class theClass = Class.forName(callingClassName, false, 
          Thread.currentThread().getContextClassLoader()); 
     if (Application.class.isAssignableFrom(theClass)) { 
      Class<? extends Application> appClass = theClass; 
      LauncherImpl.launchApplication(appClass, args); 
     } else { 
      throw new RuntimeException("Error: " + theClass 
        + " is not a subclass of javafx.application.Application"); 
     } 
    } catch (RuntimeException ex) { 
     throw ex; 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
} 

、foreachのループ反復する:あなたはlaunch(String... args)javafx.application.Apllicationの実装を見てみたときに

package Freelance; 

import javafx.application.Application ; 

public class Test 
{ 

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

} 
+0

ありがとうございます。あなたとファビアンの答えが働きます! –

関連する問題