2014-10-28 8 views
26

मैं अपने जावाएफएक्स एप्लिकेशन को बंद करने से पहले एक फाइल को सहेजना चाहता हूं।जावाएफएक्स: स्टेज क्लोज हैंडलर

इस तरह मैं Main::start में हैंडलर सेट कर रहा हूं:

primaryStage.setOnCloseRequest(event -> { 
    System.out.println("Stage is closing"); 
    // Save file 
}); 

और नियंत्रक Stage::close बुला जब एक बटन दबाया जाता है:

@FXML 
public void exitApplication(ActionEvent event) { 
    ((Stage)rootPane.getScene().getWindow()).close(); 
} 

मैं खिड़की लाल पर क्लिक बंद करते हैं खिड़की सीमा (सामान्य तरीका) पर एक्स तो मुझे आउटपुट संदेश "Stage is closing" मिलता है, जो वांछित व्यवहार है।

हालांकि, Controller::exitApplication पर कॉल करते समय एप्लिकेशन हैंडलर का उपयोग किए बिना बंद हो जाता है (कोई आउटपुट नहीं है)।

मैं नियंत्रक को हैंडलर का उपयोग कैसे कर सकता हूं जिसे मैंने primaryStage में जोड़ा है?

उत्तर

60

आप Application वर्ग के life-cycle पर एक नजर है, तो:

JavaFX क्रम करता है निम्नलिखित, क्रम में, जब भी एक आवेदन शुरू की है:

  1. संरचनाओं के एक उदाहरण निर्दिष्ट अनुप्रयोग वर्ग
  2. init() विधि
  3. कॉल करता है start(javafx.stage.Stage) विधि
  4. वेट्स खत्म करने के लिए आवेदन है, जो होता है जब निम्न में से कोई पाए जाते हैं के लिए:
    • आवेदन कॉल Platform.exit()
    • पिछली विंडो बंद कर दिया गया और Platform पर implicitExit विशेषता true
    है
  5. कॉल stop() विधि
आप फ़ाइल सहेजना मुख्य वर्ग पर stop() विधि ओवरराइड के रूप में

@FXML 
public void exitApplication(ActionEvent event) { 
    Platform.exit(); 
} 

रूप में लंबे समय:

इसका मतलब है आप अपने नियंत्रक पर Platform.exit() कॉल कर सकते हैं।

@Override 
public void stop(){ 
    System.out.println("Stage is closing"); 
    // Save file 
} 

आप देख सकते हैं, stop() का उपयोग करके आप अब फाइल को सेव करने के लिए अनुरोध बंद करने के लिए (हालांकि आप यह कर सकते हैं अगर आप खिड़की बंद करने को रोकने के लिए चाहते हैं) सुनने के लिए जरूरत नहीं है।

संबंधित मुद्दे