javafx एक APPLICATION_MODAL चरण में एक फ़ंक्शन के साथ ध्वनि अवरुद्ध करने की जगह

मैंने थोड़ा सा दृश्य बनाया और उन्हें एक मंच में रखा। मैंने चरण APPLICATION_MODAL सेट किया है:

stage.initModality(Modality.APPLICATION_MODAL);

अगर मैं कॉलिंग विंडो पर क्लिक करता हूं तो अवरुद्ध ध्वनि दिखाई देती है। तो यह सही कार्रवाई है। लेकिन क्या इस ब्लॉकिंग ध्वनि को अपने स्वयं के कार्य के साथ बदलने की कोई सकारात्मकता है? अगर मैं कॉलिंग विंडो पर क्लिक करता हूं तो मैं नया चरण बंद करना चाहता हूं, लेकिन मैंने वास्तव में मेरे दिमाग में जो कुछ भी आता है, इवेंट के लिए इवेंटफिल्टर भी कोशिश की। ANY काम नहीं करता है:

    stage.addEventFilter(Event.ANY, new EventHandler() {

        @Override
        public void handle(Event event) {
            System.out.println("Event catched: "+event);
        }
    });

कॉलिंग विंडो पर क्लिक को संभालने का कोई तरीका है?

0
जोड़ा संपादित
विचारों: 1

1 उत्तर

जब आप APPLICATION_MODAL पर कुछ सेट करते हैं, तो आप किसी भी ईवेंट को किसी भी विंडो में प्रेषित होने से रोकते हैं। इसका मतलब है कि आपके ईवेंट श्रोता का कोई उपयोग नहीं है। यहां दस्तावेज़ों का कहना है:

APPLICATION_MODAL
  एक मोडल विंडो परिभाषित करता है जो घटनाओं को अवरुद्ध करता है   किसी भी अन्य आवेदन विंडो में पहुंचा दिया।

मेरा सुझाव यह है कि जब आपका कस्टम दृश्य दिखाई देता है और जब आपका दृश्य दिखाई देता है तो पैरेंट विंडो पर क्लिक होने पर आप अपने सभी घटकों को अक्षम करते हैं, तो अपना दृश्य बंद करें। यह स्पष्ट रूप से मॉडेलिटी सेट करने की समस्या को हल करेगा (वैसे भी आपकी घटनाएं पारित नहीं की जा रही हैं)।

SSCCE:

package stack;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFieldBuilder;
import javafx.scene.effect.Reflection;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextBuilder;
import javafx.stage.Modality;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.StageBuilder;

public class DismissPopup extends Application {
    Text hello;
    Scene primaryScene;

    TextField f; 

    Stage extraStage;
    Scene extraScene;

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryScene = SceneBuilder
                .create()
                .width(300)
                .height(300)
                .root(new StackPane())
                .fill(Color.BLACK)
                .build();

        hello = TextBuilder
                .create()
                .text("Hello")
                .effect(new Reflection())
                .build();

        f = TextFieldBuilder
                .create()
                .promptText("Enter Some Text")
                .build();

        extraScene = SceneBuilder
                .create()
                .width(300)
                .height(300)
                .root(new StackPane())
                .fill(Color.WHEAT)
                .build();

        StackPane p = (StackPane) extraScene.getRoot();
        p.getChildren().addAll(hello);
        p = (StackPane) primaryScene.getRoot();
        p.getChildren().addAll(f);

        extraStage = StageBuilder
                    .create()
                    .scene(extraScene)
                    .build();

        extraStage.sizeToScene();

        primaryScene.setOnMouseClicked(new EventHandler(){
            @Override
            public void handle(MouseEvent me) {
                if(f.disabledProperty().get() == false){
                    f.setDisable(true);
                    f.setText("The TextField is disabled");
                    extraStage.show();
                }else{
                    f.setText("The TextField is enabled");
                    f.setDisable(false);
                    extraStage.close();
                }
            }
        });
        primaryStage.setScene(primaryScene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }
    public static void main(String[] args) {
        Application.launch("stack.DismissPopup");
    }
}  

Output:

enter image description here

0
जोड़ा
@MutenRoshi क्या आपने पॉपअप कक्षा देखी है?
जोड़ा लेखक Little Child, स्रोत
हाय लिटिल चाइल्ड। इस समाधान का वही प्रभाव है जो मेरे पास पहले से मौजूद संस्करण है। अगर मेरा मूल चरण पूर्णस्क्रीन में है और मैं नया चरण दिखाता हूं, तो कॉलिंग चरण पृष्ठभूमि पर भेजता है, डेस्कटॉप पर अन्य विंडो कॉलिंग चरण को कवर करती हैं और विंडोज़ टास्कबार दिखाई देती है। यही कारण है कि मैंने APPLICATION_MODAL चरण से अपने स्वयं के फ़ंक्शन के साथ विंडोज-ध्वनि को प्रतिस्थापित करने के लिए कहा। सवाल यह है कि यह समारोह कहां पंजीकृत है? कॉलिंग मंच पर? बुलाया मंच पर? मुझे नहीं पता:/हालांकि, आपकी मदद के लिए बहुत धन्यवाद!
जोड़ा लेखक Muten Roshi, स्रोत
हाँ, लेकिन मुझे कोई उपयोगी तरीका नहीं मिला। यदि मैं पॉपअप बनाता हूं, तो अपना मंच देता हूं और कॉल शो() देता हूं तो मैं कुछ भी नहीं देख सकता।
जोड़ा लेखक Muten Roshi, स्रोत