2015-07-17 2 views
0

Я создаю приложение JavaFX, и когда я создаю контроллер для своего файла FXML, конструкторы всегда одинаковы.JavaFX: Конструктор, созданный с аннотацией

Есть ли способ написать пользовательскую аннотацию для создания моих конструкторов? Что-то вроде этого:

public class MyClass() { 

    @InitFxml(file = "test") 
    public MyClass() { 
    } 

И @InitFxml введет следующий код в конструкторе:

FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"); 
... 

или можно создать аннотацию для класса, который создает конструктор по умолчанию это?

Любая помощь очень ценится.

+0

Вы используете динамический корень здесь? То есть [этот шаблон] (http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#custom_components)? –

+0

@James_D да именно этот узор – Wermerb

ответ

1

Чтобы обработать аннотацию, вам нужно будет определить какой-то контейнер, который его обработал, и всегда загружать свой класс через этот контейнер или определять обработчик аннотации, который вы подключили к компилятору (я думаю: я ничего не знаю о этот второй вариант).

Почему бы не просто передать строку в качестве параметра. Можно определить интерфейс:

import java.net.URL; 

import javafx.fxml.FXMLLoader; 


public interface CustomComponent { 
    public default void loadFXML(String fxml) { 
     try { 
      URL resource = getClass().getResource(fxml); 
      FXMLLoader loader = new FXMLLoader(resource); 
      loader.setRoot(this); 
      loader.setController(this); 
      loader.load(); 
     } catch (Exception exc) { 
      if (! (exc instanceof RuntimeException)) { 
       throw new RuntimeException(exc); 
      } else { 
       throw (RuntimeException)exc ; 
      } 
     } 
    } 
} 

, а затем просто пользовательские компоненты реализуют его, вызывая метод из конструктора:

import javafx.application.Application; 
import javafx.fxml.FXML; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class CustomComponentTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Scene scene = new Scene(new CustomVBox(), 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static class CustomVBox extends VBox implements CustomComponent { 

     @FXML 
     private Label label ; 

     public CustomVBox() { 
      loadFXML("CustomVBox.fxml"); 
     } 

     @FXML 
     private void click() { 
      System.out.println("Click!"); 
     } 
    } 

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

Это кажется быть не тяжелее, чем определение аннотации на пустом конструктор.

+0

спасибо. – Wermerb

Смежные вопросы