2014-12-26 13 views
7

Làm thế nào tôi có thể nhận được cá thể ứng dụng khi sử dụng javafx?Lấy cá thể ứng dụng trong javafx

Thông thường bạn khởi động một ứng dụng theo cách này:

public class LoginForm { 

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

} 

Phương pháp này ra mắt không trả lại một thể hiện của ứng dụng. Có cách nào tôi có thể nhận được cá thể không?

+0

Bạn đã google? http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html – Dici

+0

@Dici Ý của bạn là gì? – user2997204

+0

Mọi thứ bạn cần đều có trong tài liệu. Lớp chính của bạn chỉ cần mở rộng 'Application' và sau đó phương thức chính của bạn sẽ chỉ gọi phương thức' launch'. Trên thực tế, một phương pháp chính thậm chí không cần thiết để chạy một ứng dụng JavaFX – Dici

Trả lời

-4

ứng dụng thường JavaFX sử dụng scenebuilder cho quan điểm JavaFX và nó được ánh xạ tới một lớp điều khiển mà sẽ kêu gọi truy cập vào tập tin fxml:

public class Main extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/loginform.fxml")); 
     Parent root = myLoader.load(); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.initStyle(StageStyle.DECORATED); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 
+5

Cách trả lời câu hỏi? – mario

3

Tôi chỉ cố gắng tìm một cách logic dễ dàng để thực hiện chính xác này . Tôi không có. Nó sẽ thực sự tốt đẹp nếu có một Application.getApplicationFor (AppClass.class) quản lý một số đơn cho bạn - nhưng không.

Nếu chúng tôi hạn chế không gian sự cố, điều này khá dễ giải quyết. Nếu chúng tôi làm cho lớp một singleton, thì đó là bánh ... Một mẫu đơn đơn giản sẽ hoạt động tốt:

class MyApp extends Application 
{   
    public static MyApp me; 
    public MyApp() 
    { 
     me=this; 
    } 

    ... 
} 

Tôi có thể rỗng nếu chưa được hệ thống khởi tạo. Nó sẽ có thể bảo vệ chống lại điều đó với nhiều mã hơn.

... thực hiện mã ...

Chỉ cần thực hiện điều này - dường như làm việc (trừ đi bất kỳ tình huống luồng lạ) Tôi có một tình huống hơi khác nhau, tôi đang làm treo một màn hình JavaFX vào một swing hiện GUI. Nó hoạt động tốt, nhưng tôi cần đảm bảo rằng Application.launch chỉ được gọi một lần. Thêm yêu cầu này, giải pháp cuối cùng của tôi là như sau:

(Xin lỗi nhưng cú pháp có một số groovy trong nó, nên dễ dàng cho bất kỳ người sử dụng Java để dịch)

class MyClass extends Application{ 
    private static MyClass instance 

    public MyClass() { 
     instance=this 
    } 

    public synchronized static getInstance() { 
     if(!instance) { 
      Thread.start { 
      // Have to run in a thread because launch doesn't return 
      Application.launch(MyClass.class) 
     } 
     while(!instance) 
      Thread.sleep(100) 
    } 
    return instance 
    ... 
} // class 

này quản lý ngăn chặn cho đến khi Application.launch có hoàn thành instantiating lớp, nhận được trường hợp từ các địa điểm khác và đảm bảo rằng Application.launch được gọi chính xác một lần miễn là getInstance đã được gọi ít nhất một lần.

+0

Tôi thường phản đối việc sử dụng singleton, nhưng các tình huống không liên quan sang một bên, đối với một ứng dụng khách đơn giản, điều này sẽ hoạt động tốt, ít nhất là cho đến khi các giải pháp phức tạp hơn được yêu cầu. – Neil

Các vấn đề liên quan