2013-05-19 3 views
1

Я привык к Swing и изучаю javafx. В swing я бы создал класс, который расширяет Jpanel, а затем сможет тестировать этот класс с несколькими строками кода в этом классе, который создал JFrame.javafx Anonymous Класс приложения

Так что в JavaFX я думал, что я мог бы просто расширить сцену или группу, а затем быть в состоянии создать анонимный класс Application в основном, но это не удается с:

Исключения в потоке «главный» java.lang.RuntimeException: Ошибка: класс test.Test не подкласс javafx.application.Application в javafx.application.Application.launch (Application.java:211) в test.Test.main (Test.java:59)

Я не хочу подклассифицировать приложение, поскольку я хочу следовать этому шаблону для множества сцен/групп, и может быть только один объект приложения.

Когда это не сработало, я подумал, что могу написать простой класс, который расширяет приложение, а затем основывается на предоставленных аргументах, использует отражение для создания моей сцены, но это не сработает, поскольку нет конструктора по умолчанию для сцена ... У группы есть constuctor по умолчанию, так что, возможно, мне нужно подклассы, чтобы вместо Scene?

Должен быть способ сделать это ... это всегда был способ java 101 для тестирования и индивидуальный класс. Кто-нибудь когда-либо делал это? Любые мысли или идеи о том, как выполнить то, что я пытаюсь сделать здесь?

ява версия "1.7.0_21"
Java (TM) SE Runtime Environment (сборка 1.7.0_21-b11)
Java HotSpot (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

Пожалуйста, обратите внимание, что запуск является статическим методом, так что не знаю, что вы вызываете его на Anonymous Application-Instance вы создали!

Лучшая идея у меня есть то, что вы делаете вам код выглядеть следующим образом:

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(); 
    } 
} 
Смежные вопросы