2014-12-01 6 views
0

Я пытаюсь создать приложение с использованием JavaFX. Но приложение JavaFX не является основным входом приложения.JavaFX Object всегда null после запуска

Я использую Main -класс, а Controller -класса (который контролирующее все), а также другие классы подобно JavaFX Application

Main -(calls)-> Controller -(creates)-> JavaFX Application 

После создания JavaFX Application объекта, то Controller вызывает метод, так JavaFX Application Объект имеет экземпляр Controller

Но этот объект всегда имеет значение null, как только я выхожу за вызов метода.

Main

public class Main{ 
    public static void main(String[] args){ 
     Controller c = new Controller(); 
    } 
} 

Controller

public class Controller{ 
    private MyApplication app; 

    public Controller(){ 

     app = new MyApplication(); //create Application 
     app.setController(this); //set Controller Object 
     app.startApplication(); //launch the application 

    } 

} 

MyApplication

public class MyApplication extends Application { 

    private Stage primaryStage; 
    private BorderPane rootLayout; 
    private Controller controller; 

    @Override 
    public void start(Stage primaryStage) { 
     this.primaryStage = primaryStage; 
     initRootLayout(); 
    } 


    public void setController(Controller con){ 
     this.controller = con; 
    } 



    public void startApplication(String... args){ 
     launch(args); 
    } 

    public void initRootLayout(){ 
     System.out.println(controller==null); //returns true. But why? 

     try{ 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MyApplication.class.getResource("view/RootLayout.fxml")); 
      rootLayout = (BorderPane) loader.load(); 

      Scene scene = new Scene(rootLayout); 
      primaryStage.setScene(scene); 

      primaryStage.show(); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 

    } 
} 

Как пришел, Controller Instance в MyApplication всегда нуль. Единственный раз, когда он не равен нулю, находится в пределах звонка setController

+0

Вы можете попытаться напечатать («1» + это) в методе setController и («2» + this) в методе initRootLayout, потому что есть только 3 варианта, что он равен нулю: 1. setter called later, 2 он где-то снова задает нуль, 3. вы работаете в другом объекте MyApplication. проверьте, является ли выходной объект одинаковым, а первый - до второго. – EyeSpy

+1

Предположим, что запуск (args) создает новый MyApplication – EyeSpy

+0

@ EyeSpy. Это правильно. В приложении JavaFX подкласс 'Application' является точкой входа в приложение (эквивалент класса с методом' main' в «традиционном» Java-приложении). Таким образом, этот тип самонастраивания не поддерживается. –

ответ

1

Так как у JavaFX нет доступа к системному лотку, вам в основном требуется приложение AWT для запуска в системном трее. Затем я рассмотрел бы включение аспектов JavaFX в Swing с помощью JFXPanel и в основном сделаю его приложением Swing/AWT с встроенным JavaFX.

В качестве альтернативы вы можете запустить все из подкласса Application и просто загрузите часть AWT в методе start, настроив триггеры для работы с материалами JavaFX, когда это необходимо. Тем не менее, это кажется уродливым.

И, наконец, ваш подход только действительно терпит неудачу, потому что вам нужно передать объект в приложение JavaFX. Если имеет смысл сделать этот объект одноэлементным, то вы можете просто позволить приложению JavaFX получить его, а не передавать ему объект.

+0

Спасибо за это.Я рассмотрю некоторые подходы к Tray + JavaFX в Интернете и использую решение, которое кажется наиболее естественным для меня и моего стиля кодирования. – Loki

0

Я думаю, ваша проблема в том, что вы ссылаетесь на разные экземпляры вашего класса контроллера. После вызова launch(args) JavaFX создает собственный частный экземпляр вашего класса Application. Когда вы вызываете setController, вы устанавливаете контроллер для другого экземпляра вашего класса, чем тот, который использует JavaFX. Один из способов исправить это - сделать переменную контроллера и ее статическую установку.