2014-09-02 11 views
11

मैं एक वर्ग का एक मुख्य विधि है जो javafx.application.Applicationवर्ग की मुख्य विधि है जो आवेदन विस्तार नहीं करता

अपने आवेदन में विस्तार नहीं करता है से एक JavaFX आवेदन शुरू करने के लिए समस्या आ रही है से JavaFX शुरू MainApp.java है जो MainUIController.java, जो Applciation

फैली में ओवरराइड विधि start() शुरू जब मैं मुख्य विधि शुरू से MainUIController.java सब कुछ ठीक काम करता है चाहिए।

MainApp.java

public class MainApp { 

    public static void main(String[] args) { 
     PersonJDBCTemplate jdbc = connect(); 
     MainUIController mUIc = new MainUIController(jdbc); 
     mUIc.start(new Stage()); 

    } 

    public static PersonJDBCTemplate connect() { 
     ApplicationContext context = new ClassPathXmlApplicationContext(
       "Beans.xml"); 
     PersonJDBCTemplate personJDBCTemplate = (PersonJDBCTemplate) context 
       .getBean("personJDBCTemplate"); 
     return personJDBCTemplate; 
    } 
} 

MainUIController.java

public class MainUIController extends Application { 

    private Stage stage; 
    // private User loggedUser; 
    private final double MINIMUM_WINDOW_WIDTH = 800.0; 
    private final double MINIMUM_WINDOW_HEIGHT = 570.0; 
    private String version = "0.6"; 
    private PersonJDBCTemplate jdbc; 

    public MainUIController(PersonJDBCTemplate jdbc) { 
     this.jdbc = jdbc; 

    } 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      stage = primaryStage; 
      stage.setTitle("Sharp"); 
      stage.setMinWidth(MINIMUM_WINDOW_WIDTH); 
      stage.setMinHeight(MINIMUM_WINDOW_HEIGHT); 
      stage.setResizable(false); 
      gotoLogin(); 
      primaryStage.show(); 
     } catch (Exception ex) { 
      Logger.getLogger(MainUIController.class.getName()).log(
        Level.SEVERE, null, ex); 
     } 
    } 

    public void gotoLogin() { 
     try { 
      LoginController login = (LoginController) replaceSceneContent("/fxml/Login.fxml"); 
      login.setApp(this); 
     } catch (Exception ex) { 
      Logger.getLogger(MainUIController.class.getName()).log(
        Level.SEVERE, null, ex); 
     } 
    } 
} 

MainApp चलाने के बाद, मैं निम्नलिखित त्रुटि मिलती है:

Exception in thread "main" java.lang.ExceptionInInitializerError 
at javafx.stage.Window.<init>(Window.java:1110) 
at javafx.stage.Stage.<init>(Stage.java:236) 
at javafx.stage.Stage.<init>(Stage.java:224) 
at ch.kit.sharp.main.MainApp.main(MainApp.java:15) 
Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = main 
at com.sun.glass.ui.Application.checkEventThread(Application.java:445) 
at com.sun.glass.ui.Screen.setEventHandler(Screen.java:245) 
at com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConfigurationListener(QuantumToolkit.java:600) 
at javafx.stage.Screen.<clinit>(Screen.java:80) 
... 4 more 

उत्तर

19

क्या Nejinx कहा के अलावा, आपसे सीधे बात नहीं होना चाहिए अपने start(), हमेशा launch() कहते हैं, क्योंकि यह JavaFX पर्यावरण, यह करने के लिए एक पैरामीटर के रूप में चरण उत्तीर्ण creation of stage और calls start() सहित सेट करता है।

The docs विशेष रूप से इस

नोट बताते हुए एक नोट है: यह विधि JavaFX आवेदन थ्रेड

launch() किसी भी वर्गसे कहा जा सकता है पर कहा जाता है, अगर ध्यान में ले जा रही है कक्षा सीधे javafx.application.Application का विस्तार नहीं कर रही है, तो आपको लॉन्च विधि के लिए तर्क के रूप में विस्तारित कक्षा उत्तीर्ण करनी होगी।

उदाहरण के लिए, पर विचार आप एक वर्ग JavaFXMain जो फैली Application

class JavaFXMain extends Application {...} 

आप JavaFX आवेदन शुरू करने के लिए, किसी भी अन्य वर्ग का उपयोग कर सकते है।

class Main { 
    ... 
    public void someMethod() { 
     ... 
     JavaFXMain.launch(JavaFXMain.class); // Launch the JavaFX application 
     ... 
    } 
} 

आपके मामले में, आप MainApp की मुख्य विधि के अंदर कुछ इस तरह की कोशिश कर सकते हैं:

// You may remove args if you don't intend to pass any arguments 
MainUIController.launch(MainUIController.class, args) 
2

आपको जावाएफएक्स पर्यावरण शुरू करने की आवश्यकता है, आप लॉन्च (तर्क) के बाहर एक नया चरण नहीं बना सकते हैं; कक्षा में पहली बार कहा जा रहा है जो आवेदन को बढ़ाता है।

0

यह काफी मददगार था, लेकिन एक अकेले खड़े आवेदन के रूप में विदेशी मुद्रा आवेदन छोड़ देता है। आप अपने गैर-एफएक्स कोड से ऑब्जेक्ट्स में पास नहीं कर सकते हैं और आपको बनाए गए एप्लिकेशन इंस्टेंस के लिए कोई संभाल नहीं दिया जाता है।

मैं इस कामकाज के साथ आया कि मैं पागल नहीं हूं लेकिन यह पैरामीटर को पारित करने की अनुमति देता है।

package hacks; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

/** 
* Created by WorkDay on 8/11/16.<br> 
* <br> 
* HelloWorld is a javaFX app that needs parameters that are real objects 
*/ 

class AppParameterLauncher { 
    public static void main(String[] args) { 
     HelloWorld.launch(new ObjectThatContainsData("brave"), new ObjectThatContainsData("new")); 
    } 
} 


public class HelloWorld extends Application { 

    private static ObjectThatContainsData staticData1 = null; 
    private static ObjectThatContainsData staticData2 = null; 


    public static void launch(ObjectThatContainsData data1, ObjectThatContainsData data2) { 
     HelloWorld.staticData1 = data1; 
     HelloWorld.staticData2 = data2; 
     Application.launch(HelloWorld.class); 
    } 

    private final ObjectThatContainsData data1 = HelloWorld.staticData1; 
    private final ObjectThatContainsData data2 = HelloWorld.staticData2; 

    @Override 
    public void start(Stage primaryStage) { 

     String Text = "Hello "+data1+" "+data2+" World!"; 
     primaryStage.setTitle(Text); 
     Button btn = new Button(); 
     btn.setText("Say '"+Text+"'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.setX(0); 
     primaryStage.setY(0); 
     primaryStage.show(); 
    } 
} 

class ObjectThatContainsData { 
    public final String data; 

    ObjectThatContainsData(String data) { 
     this.data = data; 
    } 

    @Override 
    public String toString() { 
     return data; 
    } 
} 
संबंधित मुद्दे