2012-07-13 10 views
5

मैं जावाएफएक्स में नया हूं और मैं एक एप्लीकेशन बना रहा हूं और स्विंग घटकों का उपयोग करते समय जेडियलोग की तरह कुछ की आवश्यकता थी। मैंने हल किया कि नया मंच बनाकर, लेकिन अब मुझे बटन पर क्लिक करके अपने भीतर से नए चरण को बंद करने का एक तरीका चाहिए। (हाँ, एक्स बटन भी काम करता है, लेकिन इसे बटन पर भी चाहता था)। स्थिति का वर्णन करने के लिए: मेरे पास एक मुख्य वर्ग है जिसमें से मैं एक दृश्य के साथ मुख्य चरण बना देता हूं। मैं इसके लिए एफएक्सएमएल का उपयोग करता हूं।जावाएफएक्स 2: अपने आप से एक चरण (सबस्टेज) बंद करना

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); 
    stage.setTitle("Ring of Power - Builder"); 
    stage.setScene(new Scene(root)); 
    stage.setMinHeight(600.0); 
    stage.setMinWidth(800.0); 
    stage.setHeight(600); 
    stage.setWidth(800); 
    stage.centerOnScreen(); 
    stage.show(); 
} 

अब मुख्य विंडो प्रकट होता है कि मैं सभी नियंत्रण वस्तुओं और मेनू और सामान, FXML और उचित नियंत्रण वर्ग के माध्यम से किया है में। यही वह हिस्सा है जहां मैंने सहायता मेनू में जानकारी शामिल करने का निर्णय लिया था।

@FXML 
private void menuHelpAbout(ActionEvent event) throws IOException{ 
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); 
    Stage aboutBox=new Stage(); 
    aboutBox.setScene(new Scene(root2)); 
    aboutBox.centerOnScreen(); 
    aboutBox.setTitle("About Box"); 
    aboutBox.setResizable(false); 
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show(); 
} 

के रूप में देखा बॉक्स खिड़की के बारे में फिर से नियंत्रण वर्ग के साथ FXML के माध्यम से बनाया जाता है: के बारे में इस तरह सक्रिय होता है, - तो मैं एक घटना पर जब मेनू सहायता के लिए जा रहा है। एक तस्वीर, एक टेक्स्ट एरिया और एक बटन है, और मैं चाहता हूं कि वह बटन उस नए चरण को बंद कर दे जो कि लगभग बॉक्स क्लास के बारे में बात करने के लिए बॉक्स के बारे में है।

एकमात्र तरीका मैंने खुद को ऐसा करने में सक्षम होने के लिए पाया, सार्वजनिक स्थैतिक चरण के बारे में बॉक्स को परिभाषित करना था; Builder.java क्लास के अंदर और उस के बारे में AboutBox.java के भीतर से उस विधि में जो बंद बटन पर कार्रवाई ईवेंट को संभालता है। लेकिन किसी भी तरह से यह बिल्कुल साफ और सही महसूस नहीं करता है। क्या कोई बेहतर तरीका है?

आपकी सलाह के लिए अग्रिम धन्यवाद।

उत्तर

21

आप घटना हैंडलर को पारित घटना से बंद होने के लिए मंच प्राप्त कर सकते हैं।

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

इस तरह के चरण को बंद करें onCloseRequest ईवेंट हैंडलर (अगर कोई है) को छोड़ देता है। मैं लाइन चरण जोड़ूंगा .getOnCloseRequest()। हैंडल (शून्य); stage से पहले .close(); – beardedlinuxgeek

+1

धन्यवाद @beardedlinuxgeek। मुझे यह समस्या थी - मेरी खिड़की बंद हो रही थी लेकिन मैंने जिस ईवेंट हैंडलर को पंजीकृत किया था उसे नहीं बुलाया जा रहा था। आपके समाधान ने समस्या को ठीक किया। –

1

जावाएफएक्स 2.1 में, आपके पास कुछ विकल्प हैं। रास्ते में jewelsea का जवाब या तरीका क्या आप पहले से ही किया गया है या मेनू आइटम कार्रवाई ईवेंट हैंडलर में तरह

new AboutBox().show(); 

तरह

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 
उपयोग के साथ

यह संस्करण को संशोधित किया है की तरह।

+0

असल में समाधान के साथ थोड़ा कठिनाई है। ऐसा लगता है कि यह FXML के साथ पहले संस्करण को पसंद नहीं करता है। – Meg

+0

समस्या यह प्रतीत होती है कि आप क्लास AboutBox.java को कॉल करते हैं, जिसे स्वयं को aboutBox.fxml के लिए नियंत्रण कक्षा माना जाता है, जब तक कि आपने AboutPage.fxml < – Meg

+0

@Meg लिखा था। उत्तर अपडेट किया गया। AboutBox.java या तो AboutBox.fxml या AboutPage.fxml का नियंत्रक नहीं है। –

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