2012-11-26 34 views
31

मैं नियंत्रकपास fxml खिड़की, JavaFX

मैं stage.close पता() या stage.hide (में कोड द्वारा वर्तमान fxml विंडो को बंद करने की जरूरत है) fx में ऐसा

इसे fxml में कैसे कार्यान्वित करें? मैंने

private void on_btnClose_clicked(ActionEvent actionEvent) { 
     Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));  
     Scene scene = new Scene(root); 

     Stage stage = new Stage();    
     stage.setScene(scene); 
     stage.show(); 
} 

लेकिन यह काम नहीं करता है!

सभी मदद की सराहना की जाएगी। धन्यवाद!

उत्तर

102
  1. अपने करीबी बटन एक fx देना (getScene() नोड की एक विधि है) <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. अपने नियंत्रक वर्ग में:

    @FXML private javafx.scene.control.Button closeButton; 
    
    @FXML 
    private void closeButtonAction(){ 
        // get a handle to the stage 
        Stage stage = (Stage) closeButton.getScene().getWindow(); 
        // do what you have to do 
        stage.close(); 
    } 
    
+3

यह दृष्टिकोण मेरे लिए काम नहीं करता है। मुझे एक 'NullPointerException' –

+0

अद्भुत काम मिलता है! , बस मामले में, लोगों को याद रखें कि आपके बटन का नाम (यह मामला क्लोजबटन) और आपके ऑनक्लिक का नाम (इस मामले को बंद करें बटन) –

+0

यह केवल विंडो बंद कर देता है, लेकिन एप्लिकेशन अभी भी चल रहा है !!! –

1

मुझे यकीन है कि अगर यह सबसे अच्छा तरीका है नहीं कर रहा हूँ (या अगर यह काम करता है), लेकिन आप की कोशिश कर सकते:

private void on_btnClose_clicked(ActionEvent actionEvent) { 

     Window window = getScene().getWindow(); 

     if (window instanceof Stage){ 
      ((Stage) window).close(); 
     } 
} 

(यह मानते हुए अपने नियंत्रक एक नोड है नहीं तो आप प्रथम नोड निकलना है। , आईडी अगर आप अभी तक नहीं किया है::

13

आपको एक विंडो जो फैली javafx.application.Application; आप निम्न विधि का उपयोग कर सकते हैं।

Platform.exit(); 

उदाहरण: जावा 8 की खूबसूरती के लिए

public class MainGUI extends Application { 
......... 

Button exitButton = new Button("Exit"); 
exitButton.setOnAction(new ExitButtonListener()); 
......... 

public class ExitButtonListener implements EventHandler<ActionEvent> { 

    @Override 
    public void handle(ActionEvent arg0) { 
    Platform.exit(); 
    } 
} 

संपादित करें:

public class MainGUI extends Application { 
    ......... 

    Button exitButton = new Button("Exit"); 
    exitButton.setOnAction(actionEvent -> Platform.exit()); 
} 
+0

'Platform.exit()' सभी चरणों को बंद कर देगा और पूरे एप्लिकेशन को गोली मार दी जाएगी। यह वांछित नहीं हो सकता है। – nonybrighto

+0

मूल पोस्टर एक खिड़की (मंच) को बंद करने के लिए कह रहा था, आवेदन नहीं। –

0
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    public void handle(WindowEvent we) {       
     Platform.setImplicitExit(false) 
      stage.close() 
     } 
    }); 

यह hide के बराबर है। तो जब आप अगली बार इसे खोलने जा रहे हैं, तो आप जांच लें कि stage ऑब्जेक्ट बाहर निकला है या नहीं। यदि यह निकला है, तो आप show() यानी (stage.show()) कॉल करें। अन्यथा, आपको मंच शुरू करना होगा।

4

मैंने स्वीकृत उत्तर से NullPointerException प्राप्त करने के बाद इसे निम्न तरीके से कार्यान्वित किया।

मेरी FXML में:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel"> 

मेरी Controller वर्ग में:

@FXML public void onMouseClickedCancelBtn(InputEvent e) { 
    final Node source = (Node) e.getSource(); 
    final Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
} 
1

मैं एक अच्छा समाधान है जो एक घटना की जरूरत नहीं है पाया ट्रिगर किए जाने वाले:

@FXML 
private Button cancelButton; 

close(new Event(cancelButton, stage, null)); 

@FXML 
private void close(Event event) { 
    ((Node)(event.getSource())).getScene().getWindow().hide();      
} 
0

आप इसे आसानी से प्राप्त कर सकते हैं,

@FXML 
private void closeAction(ActionEvent evt){ 
    System.exit(0); 
} 

आपके लिए चाल करेगा।