2012-11-20 24 views
6

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

तो मैं स्पष्टीकरण के लिए एक छोटे से उदाहरण का निर्माण:

मुख्य वर्ग:

public class Test_TwoController extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("Fxml1.fxml")); 
     Scene scene = new Scene(root);     
     stage.setScene(scene); 
     stage.show(); 
    }  
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

मुख्य fxml:

<AnchorPane id="fxml1_anchorpane_id" fx:id="fxml1_anchorpane" prefHeight="206.0" prefWidth="406.0" xmlns:fx="http://javafx.com/fxml" fx:controller="test_twocontroller.Fxml1Controller"> 
    <children> 
    <HBox id="fxml1_hbox_id" fx:id="fxml1_hbox" prefHeight="200.0" prefWidth="400.0"> 
     <children> 
     <Button id="fxml1_button_id" fx:id="fxml1_button" mnemonicParsing="false" onAction="#button_action" prefHeight="200.0" prefWidth="200.0" text="Button" /> 
     </children> 
    </HBox> 
    </children> 
</AnchorPane> 

और उसके नियंत्रक:

public class Fxml1Controller implements Initializable { 

    @FXML HBox hbox; 
    @FXML Button button; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { } 

    public void button_action(ActionEvent event) throws IOException { 
     // 1. add an instance of Fxml2 to hbox 
     // 2. change to tab2 in new Fxml2 
     // or 
     // notify Fxml2Controller to change to tab2 in Fxml2 
    } 
} 

और अब नियंत्रण करने के लिए नियंत्रण amically जोड़ें:

इसके fxml:

<AnchorPane id="fxml2_anchorpane_id" fx:id="fxml2_anchorpane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml" fx:controller="test_twocontroller.Fxml2Controller"> 
    <children> 
    <TabPane id="fxml2_tabpane_id" fx:id="fxml2_tabpane" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE"> 
     <tabs> 
     <Tab id="fxml2_tab1_id" fx:id="fxml2_tab1" text="tab1"> 
      <content> 
      <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
      </content> 
     </Tab> 
     <Tab id="fxml2_tab2_id" fx:id="fxml2_tab2" onSelectionChanged="#onSelectionChanged" text="tab2"> 
      <content> 
      <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
      </content> 
     </Tab> 
     </tabs> 
    </TabPane> 
    </children> 
</AnchorPane> 

और controler:

public class Fxml2Controller { 

    @FXML TabPane tabpane; 
    @FXML Tab tab1; 
    @FXML Tab tab2; 

    public Fxml2Controller() throws IOException { 
     Parent root = FXMLLoader.load(getClass().getResource("Fxml2.fxml")); 
     Scene scene = new Scene(root);   
     Stage stage = new Stage(); 
     stage.setScene(scene);   
    }  

    public void onSelectionChanged(Event e) throws IOException { 

     FXMLLoader loader = new FXMLLoader(); 
     // how can i get the current Fxml1 anchorpane instance? 
     AnchorPane root = (AnchorPane) loader.load(getClass().getResource("Fxml1.fxml").openStream()); 

     Button b = (Button)root.lookup("#fxml1_button_id");   
     b.setText("New Button Text"); // dont change the buttons text!!!    
} 
} 

उपयोग है: एक fxml2 fxml1 की hbox में जोड़ा जाना चाहिए। फिर एक बटन के बाद fxml1 में क्लिक करें fxml2 के टैब बदलना चाहिए। आप उस छवि पर एक नज़र हो सकता है http://s13.postimage.org/uyrmgylo7/two_controlls.png

तो मेरी प्रश्न हैं:

  • मैं एक या fxml1 की hbox में fxml2 नियंत्रक के और अधिक कैसे जोड़ सकते हैं?
  • मैं कैसे एक-दूसरे नियंत्रण का उपयोग या नियंत्रण के बीच संवाद कर सकते हैं? विस्तार के लिए Fxml2Controller में चयनChanged() विधि पर देखें।

अग्रिम धन्यवाद, solarisx

उत्तर

5

आप काफी कुछ अवधारणाओं को एक साथ जो अलग हैं मिश्रित करने लगते हैं। सबसे पहले, एक स्टेज स्क्रीन पर एक खिड़की के रूप में समझा जा सकता है। इसमें एक दृश्य वस्तु है जिसमें वास्तविक दृश्यग्राफ है। आपके उदाहरण में, आप एक नया चरण और एक नई दृश्य बना रहे हैं जो आपकी दूसरी fxml-file की सामग्री भरती है। इसका मतलब यह है कि, अगर काम कर रहा है, तो दूसरी सामग्री आपके सामान को पॉप अप करेगी। मुझे नहीं लगता कि यह वही है जो आप प्राप्त करना चाहते हैं।

यही नहीं, जब FXMLLoader एक फ़ाइल पढ़ता है, यह वर्ग है कि इसके नियंत्रक के रूप में निर्दिष्ट और प्रतिबिंब के माध्यम से इसे का एक उदाहरण का निर्माण करती है के लिए लग रहा है। इसका मतलब यह है कि जब आप fxml-फ़ाइल आप इसके साथ लोड कर रहे हैं के नियंत्रक के निर्माता में लोड विधि कॉल, आप एक अनंत लूप के कारण कर रहे हैं।

समझने की आखिरी बात यह है कि load() रिटर्न एक मनमाना नोड है जिसे किसी अन्य नोड की तरह आपके एप्लिकेशन के दृश्यग्राफ में रखा जा सकता है।

तो अपने अवधारणा काम करने के लिए, आप निम्न करना चाहिए:

  1. ले जाएँ लोड हो रहा है-कोड जो अपने पहले नियंत्रक के BUTTON_ACTION विधि करने के लिए अपने दूसरे नियंत्रक के निर्माता में है।
  2. बटन_एक्शन में नए चरण-नए-दृश्य कोड को फेंक दें और Node को FXMLLoader द्वारा वापस ले जाएं और इसे HBox के बच्चों में जोड़ें।
  3. अपने दूसरे प्रश्न के लिए, यदि आप वास्तव में स्थिर विधि को कॉल करने के बजाय FXMLLoader का उदाहरण बनाते हैं, तो आप नियंत्रक उदाहरण प्राप्त कर सकते हैं और इसमें load() विधि का उपयोग कर सकते हैं। load() पर कॉल करने के बाद आप getController() और getRoot() के माध्यम से fxml-file के नियंत्रक और रूट ऑब्जेक्ट को पुनर्प्राप्त कर सकते हैं। फिर आप अपने तर्क में किसी भी मनमानी वस्तु की तरह ही उनका उपयोग कर सकते हैं।
+0

आपके उत्तर के लिए धन्यवाद। बिंदु 1. और 2. के साथ मैं Fxml2 को अब Fxml1 में जोड़ सकता हूं। लेकिन नियंत्रणों तक पहुंच अभी भी मुझे स्पष्ट नहीं है। Fxml2 में Fxml2 जोड़ने के बाद, यदि Fxml2 में कुछ होता है तो मैं Fxml1 में कुछ बदलना चाहता हूं। मैंने बेहतर स्पष्टीकरण के लिए Fxml2Controller() कोड में एक चयन चयन विधि जोड़ा। मुझे लगता है कि समस्या यह है कि मुझे Fxml1 का वर्तमान उदाहरण नहीं मिला। – solarisx

+0

ठीक है। सेबस्टियन 3 में मेरे दूसरे प्रश्न का उत्तर मिला। बिंदु और [FXML नियंत्रक वर्ग तक पहुंच] (http://stackoverflow.com/questions/10751271/accessing-fxml-controller-class?lq=1)। नियंत्रक तक पहुंचने पर शून्य से बचने के लिए [मैं JavaFx 2.0 में नियंत्रक वर्ग का उपयोग कैसे कर सकता हूं?] (Http://stackoverflow.com/questions/10240471/how-can-i-access-a-controller-class-in- JavaFX-2-0) – solarisx