[javafx] एक ही दृश्य में नया fxml लोड हो रहा है


Answers

मुझे यकीन नहीं है कि यह कितना प्रभावी है, लेकिन यह ठीक है और क्या अधिक है, उपर्युक्त विधियों के लिए बहुत आसान है।

https://www.youtube.com/watch?v=LDVztNtJWOo

जहां तक ​​मुझे समझ में आया कि यहां क्या हो रहा है यह है (यह वास्तव में अनुप्रयोग वर्ग में प्रारंभ () विधि में क्या हो रहा है के समान है):

private void buttonGoToWindow3Action(ActionEvent event) throws IOException{
    Parent window3; //we need to load the layout that we want to swap
    window3 = (StackPane)FXMLLoader.load(getClass().getResource("/ScenePackage/FXMLWindow3"));

    Scene newScene; //then we create a new scene with our new layout
    newScene = new Scene(window3);

    Stage mainWindow; //Here is the magic. We get the reference to main Stage.
    mainWindow = (Stage)  ((Node)event.getSource()).getScene().getWindow();

    mainWindow.setScene(newScene); //here we simply set the new scene
}

हालांकि मैं जावा विशेषज्ञ नहीं हूं और प्रोग्रामिंग के लिए काफी नया हूं, इसलिए अगर कोई अनुभवी इसका मूल्यांकन करेगा तो यह अच्छा होगा।

संपादित करें: मुझे भी सरल विधि मिली है;

मुख्य अनुप्रयोग वर्ग पर जाएं और स्थैतिक चरण माता-पिता बनाएं।

public static Stage parentWindow;
@Override
public void start(Stage stage) throws Exception {
    parentWindow = stage;

    Parent root = FXMLLoader.load(getClass().getResource("/ScenePackage/FXMLMainScene.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
}

अब आप अपने मुख्य चरण में acces प्राप्त करते हैं, इसलिए किसी भी प्रोग्राम में आप दृश्य को बदलने के लिए ऐसा कुछ कर सकते हैं:

    Parent window1;
    window1 = FXMLLoader.load(getClass().getResource("/ScenePackage/FXMLWindow1.fxml"));

    //Scene newSceneWindow1 = new Scene(window1);

    Stage mainStage;
    //mainStage = (Stage)  ((Node)event.getSource()).getScene().getWindow();
    mainStage = MainApplication.parentWindow;
    mainStage.getScene().setRoot(newSceneWindow1); //we dont need to change whole sceene, only set new root.
Question

मेरे पास 2 एफएक्सएमएल फाइलें हैं:

  • लेआउट (हेडर, मेनूबार और सामग्री)
  • Anchorpane (यह अन्य fxml फ़ाइल से सामग्री के अंदर रखा जाना चाहिए)

मैं जानना चाहता हूं कि मैं "मास्टर" दृश्य से सामग्री स्थान के अंदर दूसरी फ़ाइल कैसे लोड कर सकता हूं। और क्या यह जावाएक्सएक्स में काम करने के लिए एक अच्छी बात है या क्या यह एक नया दृश्य लोड करना बेहतर है?

मैं ऐसा कुछ करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं करता है:

@FXML
private AnchorPane content;

@FXML
private void handleButtonAction(ActionEvent event) {        
    content = (AnchorPane) FXMLLoader.load("vista2.fxml");
}

सहायता के लिए धन्यवाद।




इसमें भी फंस गया, ज्यादातर जवाबों का प्रयास किया, जो मैं चाहता था वह नहीं था इसलिए मैंने ऐसा करने के लिए दिए गए आदर्शों का उपयोग किया:

public class Main extends Application {
public static Stage homeStage;
@Override
public void start(Stage primaryStage) throws Exception{
    homeStage = primaryStage;
    Parent root = FXMLLoader.load(getClass().getResource("mainView.fxml"));
    root.getStylesheets().add(getClass().getResource("stylesheet/custom.css").toExternalForm());
    homeStage.setTitle("Classification of Living Organisms");
    homeStage.setScene(new Scene(root, 600, 500));
    homeStage.show();
}


public static void main(String[] args) {
    launch(args);
  }
}

यह मेरी मुख्य कक्षा है। लैंडिंग विंडो / पेज mainView.fxml के साथ Main.java। @Tomasz विचार का थोड़ा सा उपयोग किया, हालांकि मैंने अपने मुख्य नियंत्रक.जावा वर्ग में ऐसा करने से पहले मुझे एक लिल उलझन में डाल दिया:

public void gotoSubMenu(Event event) {
    Parent window1;
    try {
        window1 = FXMLLoader.load(getClass().getResource("src/displayView.fxml"));
        Stage window1Stage;
        Scene window1Scene = new Scene(window1, 600, 500);
        window1Stage = Main.homeStage;
        window1Stage.setScene(window1Scene);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

'विंडो 1' नामक एक नई अभिभावक विंडो बनाई जिसने दूसरी निर्देशिका में 'displayView.fxml' नामक दूसरी fxml फ़ाइल लोड की। मुख्य दृश्य चरण का एक ऑब्जेक्ट बनाया और दृश्य को नव निर्मित दृश्य में सेट किया जिसका रूट विंडो 1 है। उम्मीद है कि यह #JavaFX में आने वाले लोगों की सहायता करेगा।




mask का मेरा उदाहरण।

का उपयोग करते हुए:

Main.getNavigation().load(View2.URL_FXML).Show();
Main.getNavigation().GoBack();



Links