2016-12-02 13 views
1

У меня есть класс, который реализует Initializingable.JavaFx вызов супер метод после супер инициализации

public abstract class ExampleClass implements Initializable { 

    public void ExampleClass() { 
     // Load FXML 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // Initialize stuff 
    } 

    public void afterInitialize() { 
     // Do things that are reliant upon the FXML being loaded 
    } 
} 

Я тогда продлить этот абстрактный класс:

public class ExampleSubclass extends ExampleClass { 

    public ExampleSubclass() { 
     super(/* real code has params */); 
     this.afterInitialize(); // Problem here 
    } 
} 

Однако, когда я называю afterInitialize(), он ведет себя так, как будто FXML в абстрактном классе еще не был загружен. Это меня смущает, поскольку я сначала называю конструктором super(), поэтому я считаю, что FXML должен быть уже загружен.

Что я делаю неправильно?

Заранее спасибо.

+2

Почему п ot вызывает 'this.afterInitialize();' внутри 'initialize (.., ...);'? Только тогда вы уверены, что FXML успешно загружен. Ваш вопрос интересен. – GOXR3PLUS

+0

Как правило, это то, что я бы сделал, но мне нужно передать параметры из 'ExampleSubclass' в' afterInitialize() '(вероятно, следовало бы указать, что в вопросе, мой плохой) – user3668541

+1

Фактически, предоставленный здесь ответ отличный, i din даже не знал о аннотации @ @ PostConstruct. – GOXR3PLUS

ответ

2

В соответствии с этим answer вызов метода initialize не будет выполняться в конструкторе, но после него. Поэтому, когда вы вызываете afterInitialize в конструкторе подкласса, он фактически вызывается до initialize!

В нескольких словах: Конструктор называется первым, то любое @FXML аннотированные поля заполняются, то инициализация() называется ...

Так что, когда initialize называется все FXML элементы уже загружены, и как другие предложили, вы можете вызвать afterInitialize внутри initialize метода, но если вы не хотите, чтобы сделать это, вы можете использовать @PostConstruct аннотацию:

public abstract class ExampleClass implements Initializable { 

    public void ExampleClass() { 
     // Load FXML 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // Initialize stuff 
    } 

    @PostConstruct 
    public void afterInitialize() { 
     // Do things that are reliant upon the FXML being loaded 
    } 
} 


public class ExampleSubclass extends ExampleClass { 

    public ExampleSubclass() { 
     super(/* real code has params */); 
    } 

    @PostConstruct 
    @Override 
    public void afterInitialize() { 
     super.afterInitialize(); 
     // other things 
    } 
} 
+2

Это может быть полезно также (http://zachxu.blogspot.gr/2016/09/java-annotation-postconstruct-and.html) – GOXR3PLUS

+2

Это определенно ответил на мой вопрос, спасибо! Я не знал о теге @PostConstruct, поэтому чтение об этом было очень полезно. – user3668541

+0

Я рад, что это помогло – Omid

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

  • Нет связанных вопросов^_^