2013-05-19 86 views
1

我習慣了Swing,並且正在探索javafx。在swing中,我會創建一個擴展Jpanel的類,然後可以在該類中創建一個JFrame的幾行代碼來測試該類。javafx匿名應用程序類

所以在JavaFX的,我想我可能只是延長場景或組,然後就可以在主創建一個匿名的應用程序類,但失敗有:

異常在線程「主」了java.lang.RuntimeException:錯誤:類test.Test不在javafx.application.Application.launch(Application.java:211) javafx.application.Application 的一個子類在test.Test.main(Test.java:59)

我不想爲應用程序子類化,因爲我想按照這種模式處理大量的場景/組,並且只能有一個應用程序對象。

當這沒有奏效時,我想我可以編寫一個簡單的類來擴展Application,然後根據提供的參數,使用反射來創建我的場景,但這不起作用,因爲沒有默認的構造函數一個場景...... Group有一個默認的構造函數,所以也許我需要繼承而不是Scene?

必須有一種方法來做到這一點...這一直是一種測試和個人課程的java 101方法。有沒有人曾經這樣做過?關於如何完成我在這裏要做的事情的任何想法或想法?

Java版本 「1.7.0_21」
的Java(TM)SE運行時環境(建立1.7.0_21-B11)
爪哇熱點(TM)64位服務器VM(建立23.21-B01,混合模式)

這裏是我的代碼:

package test; 

import javafx.application.*; 
import javafx.geometry.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.*; 
import javafx.scene.input.*; 
import javafx.scene.effect.*; 

public class Test extends javafx.scene.Scene 
{ 
    public Test(javafx.scene.Group group, int width, int height) 
    { 
     super(group, width, height); 
     GridPane grid = new GridPane(); 
     grid.setVgap(4); 
     grid.setHgap(10); 
     grid.setPadding(new Insets(5, 5, 5, 5)); 

     final Button button = new Button ("Ok"); 
     final Label notification = new Label(); 
     final TextField subject = new TextField("");  
     final TextArea text = new TextArea (""); 

     final ComboBox priorityComboBox = new ComboBox();  
     priorityComboBox.getItems().addAll("Highest", "High", "Normal", "Low", "Lowest"); 
     priorityComboBox.setValue("Normal"); 

     grid.add(new Label("Priority: "), 0, 0); 
     grid.add(priorityComboBox, 1, 0); 
     grid.add(new Label("Subject: "), 0, 1); 
     grid.add(subject, 1, 1, 3, 1); 
     grid.add(text, 0, 2, 4, 1); 
     grid.add(button, 0, 3); 

     group.getChildren().add(grid); 
    } 

    public static void main(String [] args) 
    { 
     Application app = new Application() 
     { 
     public void start(Stage stage) 
     { 
      stage.setTitle("Test"); 
      Scene scene = new Test(new Group(), 450, 250); 
      stage.setScene(scene); 
      stage.show(); 
     } 

     }; 
     app.launch(args); 
    } 
} 

回答

2

請注意,發射是一個靜態方法,所以它不知道你在呼喚它,你創建的匿名應用程序實例!

最好的辦法我已經是你讓你的代碼是這樣的:

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

public static class MyApp extends Application { 
    public void start(Stage stage) 
    { 
      stage.setTitle("Test"); 
      Scene scene = new Test(new Group(), 450, 250); 
      stage.setScene(scene); 
      stage.show(); 
    } 
}