2012-05-25 9 views
41

एक्सेस करना मैं मुख्य एप्लिकेशन या अन्य चरणों से स्क्रीन पर जानकारी अपडेट करने के लिए किसी भी समय FXML नियंत्रक कक्षा के साथ संवाद करना चाहता हूं।FXML नियंत्रक वर्ग

क्या यह संभव है? मुझे ऐसा करने का कोई तरीका मिला है।

स्टेटिक फ़ंक्शंस एक तरीका हो सकता है, लेकिन उनके पास फॉर्म के नियंत्रण तक पहुंच नहीं है।

कोई विचार?

उत्तर

69

आप अपने मुख्य मंच में FXMLLoader

FXMLLoader fxmlLoader = new FXMLLoader(); 
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream()); 
FooController fooController = (FooController) fxmlLoader.getController(); 

दुकान से नियंत्रक हो और getFooController() गेटर विधि प्रदान कर सकते हैं।
अन्य वर्गों या चरणों, हर बार जब आप भरी हुई "foo.fxml" पृष्ठ को ताज़ा करने, अपने नियंत्रक से यह पूछने की जरूरत से:

getFooController().updatePage(strData); 

updatePage() हो सकता है कुछ की तरह:

// ... 
@FXML private Label lblData; 
// ... 
public void updatePage(String data){ 
    lblData.setText(data); 
} 
// ... 
FooController क्लास में


इस प्रकार अन्य पृष्ठ उपयोगकर्ता पृष्ठ की आंतरिक संरचना के बारे में परेशान नहीं हैं जैसे कि Label lblData क्या है और कहां है।

https://stackoverflow.com/a/10718683/682495 भी देखें। जावाएफएक्स 2.2 FXMLLoader में सुधार हुआ है।

+2

मैं ने पाया है कि स्थिर कार्यों का उपयोग कर आसान है और इस समाधान की तुलना में बेहतर काम करता है मेरे लिए कम से कम)। नियंत्रणों तक पहुंचने में सक्षम होने की कुंजी कक्षा के सार्वजनिक स्थैतिक उदाहरण के लिए है जिसमें सभी नियंत्रणों और सार्वजनिक तरीकों तक पहुंच है। – betaman

+0

मुझे पता है कि यह एक पुराना सवाल है ... लेकिन क्या कोई भी उत्तर w.r.t. पर अधिक जानकारी प्रदान कर सकता है। जहां कोड की पहली 3 पंक्तियां और जहां getFooController() जाता है? – adeena

+0

@डेना, FooController आपके द्वारा "foo.fxml" में परिभाषित एक नियंत्रक वर्ग है, और कोड में कोई getFooController() नहीं है। –

2

मुख्य स्क्रीन से ऑब्जेक्ट की लोडिंग पर, मुझे जो डेटा मिला है और काम करने के लिए एक तरीका है, वह लुकअप का उपयोग करना है और उसके बाद डेटा को अदृश्य लेबल के अंदर सेट करना है जिसे मैं बाद में नियंत्रक वर्ग से पुनर्प्राप्त कर सकता हूं। इस तरह:

Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml")); 
Label lblData = (Label) root.lookup("#lblData"); 
if (lblData!=null) lblData.setText(strData); 

यह काम करता है, लेकिन एक बेहतर तरीका होना चाहिए।

7

एक और समाधान नियंत्रक को आपके नियंत्रक वर्ग से सेट करना है, जैसे ...

public class Controller implements javafx.fxml.Initializable { 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // Implementing the Initializable interface means that this method 
     // will be called when the controller instance is created 
     App.setController(this); 
    } 

} 

यह समाधान मैं के बाद से कोड कुछ हद तक गंदा है उपयोग करने के लिए एक पूरी तरह कार्यात्मक FXMLLoader उदाहरण है, जिसमें ठीक से स्थानीय संसाधनों आदि

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml")); 
} 

संभालती बनाम

@Override 
public void start(Stage stage) throws Exception { 
    URL location = getClass().getResource("/sample.fxml"); 
    FXMLLoader loader = createFXMLLoader(location); 
    Parent root = loader.load(location.openStream()); 
} 

public FXMLLoader createFXMLLoader(URL location) { 
    return new FXMLLoader(location, null, new JavaFXBuilderFactory(), null, Charset.forName(FXMLLoader.DEFAULT_CHARSET_NAME)); 
} 
+0

यह समाधान जावाएफएक्स के पिछले संस्करणों के साथ भी काम करता है (<2.2)। – Neil

7

बनाने के लिए पसंद करते हैं है केवल स्वीकृत उत्तर को स्पष्ट करने में मदद करने के लिए और शायद उन लोगों के लिए थोडा समय बचाएं जो JavaFX के लिए नए हैं:

एक JavaFX FXML आवेदन के लिए, NetBeans अपने प्रारंभ विधि मुख्य वर्ग में इस प्रकार स्वत: उत्पन्न करेगा:

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

    Scene scene = new Scene(root); 

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

अब, सभी हम नियंत्रक वर्ग का उपयोग करने की क्या करने की जरूरत बदलने के लिए है एक instantiated कार्यान्वयन के लिए स्थिर कार्यान्वयन से load() विधि FXMLLoader और फिर हम उदाहरण के विधि का उपयोग इस तरह, नियंत्रक प्राप्त करने के लिए कर सकते हैं: (पर

//Static global variable for the controller (where MyController is the name of your controller class 
static MyController myControllerHandle; 

@Override 
public void start(Stage stage) throws Exception { 
    //Set up instance instead of using static load() method 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml")); 
    Parent root = loader.load(); 

    //Now we have access to getController() through the instance... don't forget the type cast 
    myControllerHandle = (MyController)loader.getController(); 

    Scene scene = new Scene(root); 

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

स्पष्ट टिप्पणियों के साथ बहुत अच्छा जवाब! – user2407334