2013-03-13 10 views

उत्तर

31

नहीं, जावाफ़ैक्स 2.2 Accordion में एक समय में केवल एक खुला फलक हो सकता है।

मैंने एक सुविधा के लिए एक वृद्धि अनुरोध (JDK-8090554 StackedTitledPanes control) बनाया है जो आपको एक समय में एक से अधिक फलक खोलने की अनुमति देता है, हालांकि सुविधा अनुरोध वर्तमान में लागू नहीं किया गया है।

इस बीच, आप TitledPane उदाहरणों को बनाकर और VBox में रख कर अपने आप को एक समान नियंत्रण बना सकते हैं।

private VBox createStackedTitledPanes() { 
    final VBox stackedTitledPanes = new VBox(); 
    stackedTitledPanes.getChildren().setAll(
    new TitledPane("Pane 1", contentNode1), 
    new TitledPane("Pane 2", contentNode2), 
    new TitledPane("Pane 3", contentNode3) 
); 
    ((TitledPane) stackedTitledPanes.getChildren().get(0)).setExpanded(true); 

    return stackedTitledPanes; 
} 

आवश्यक हैं, तो आप VBox एक ScrollPane में अपने शीशे युक्त, ताकि आपके विस्तार शीशे के सभी की सामग्री को प्रयोग करने योग्य है, तो अपने क्षेत्र उपलब्ध क्षेत्र overflows हो सकता है लपेट कर सकते हैं।

मैंने sample solution बनाया (आइकन लिंकवेयर हैं: http://www.fasticon.com)।

fishyfishy

+0

हाय, धन्यवाद। यह मेरे लिए काफी काम करेगा। – sight

+0

फ़ीचर अनुरोध लिंक अब और काम नहीं करता है। –

+0

हां, जावाएफएक्स विशिष्ट जिरा इश्यू ट्रैकिंग सिस्टम बंद कर दिया गया है। जहां तक ​​मुझे पता है कि उस सिस्टम से मुद्दों और फीचर अनुरोधों को आधिकारिक जेडीके मुद्दे ट्रैकिंग सिस्टम में स्थानांतरित कर दिया गया था, लेकिन मुझे नहीं पता कि उस सिस्टम में संबंधित समस्या को कैसे ढूंढें या लिंक करें। इस नियंत्रण के लिए आधिकारिक जेडीके फीचर अनुरोध प्रक्रिया के माध्यम से जाने के बजाय, मैं [थर्ड पार्टी कंट्रोलएफएक्स लाइब्रेरी] (http://fxexperience.com/controlsfx/) डेवलपर्स से संपर्क करने की सलाह देता हूं और देखता हूं कि क्या उन्हें स्टैक्डटाइटलपेन्स नियंत्रण जोड़ने में कोई रूचि है या नहीं उनकी पुस्तकालय – jewelsea

0

मैं थोड़ा अलग आवश्यकताओं

  1. अकॉर्डियन या तो बढ़ती है या एम्बेडेड विचारों
  2. पूरे दृश्य एक स्क्रॉल दृश्य
  3. हर में रखा जा सकता है के लिए दृश्य अंतरिक्ष में सफल हुआ था बॉक्स पूरी तरह से आकार के आकार तक फैलता है, अगर accordion निश्चित आकार है, या यह सामग्री के आकार तक फैलता है, अगर यह निश्चित दृश्य नहीं है। एक VBox साथ

    1) एक Scrollpane का उपयोग करें:

मेरे मामले में हालांकि, मैं नहीं 3. और परीक्षण 2. के सभी को पूरा करने में सक्षम है, मैं निम्नलिखित फिक्स साथ आने के लिए सक्षम था था अंदर, TitledWindows के अंदर अंदर। 2) सुनिश्चित करें कि आपके TitledPanes पर सेट हैं VBox.grow = "SOMETIMES"। 3) अंतिम तत्व के रूप में एक VBox जोड़ें और सेट करें VBox.vgrow = "हमेशा" - यह टाइटलडपेन्स को उनके न्यूनतम आकार तक धक्का देता है। अन्य सभी को कोड उदाहरण प्रदान की गई है, तो आप fxml उपयोग करना चाहते हैं, या जावा का उपयोग करने के लिए, बस तत्वों सीधे बस के रूप में अच्छी तरह से (SceneBuilder साथ उत्पन्न) काम करता है का उपयोग नहीं करना चाहती:

<ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
    <content> 
     <VBox fx:id="leftVBox" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="100.0"> 
      <children> 
       <TitledPane fx:id="titledPanelOne" animated="false" expanded="false" style="-fx-background-color: red;" text="Pane One" VBox.vgrow="SOMETIMES"> 
       <content> 
        <ListView fx:id="listViewOne" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> 
       </content> 
       </TitledPane> 
       <TitledPane fx:id="titledPanelTwo" animated="false" expanded="false" style="-fx-background-color: green;" text="Pane Two" VBox.vgrow="SOMETIMES"> 
       <content> 
        <ListView fx:id="listViewTwo" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> 
       </content> 
       </TitledPane> 
       <VBox prefHeight="0.0" prefWidth="0.0" VBox.vgrow="ALWAYS" /> 
      </children> 
     </VBox> 
    </content> 
</ScrollPane> 

4) हालांकि इस करता है आपको एक दूसरे के स्वतंत्र रूप से विस्तार/अनुबंध करने वाले बक्से मिलते हैं, यह उस समस्या को ठीक नहीं करता है जहां आपके पास ऐसे बॉक्स हैं जो उनकी सामग्री के लिए सही ढंग से आकार नहीं लेते हैं (उदाहरण के लिए आपके ऊपर उपरोक्त उदाहरण में एम्बेड की गई सूची दृश्य है), और इसलिए जब आपको बहुत सारी स्क्रीन रीयल-एस्टेट छोड़ी गई है तो अब आपको बहुत कुछ स्क्रॉल करना होगा। समाधान? जावा का एक बिट आवश्यक है।

यह सुधार लागू करने के लिए, हम पहले बाँध TitledPane के maxHeightProperty() बाहरी VBox के heightProperty() रहे हैं:

public class Controller implements Initializable { 
    //... controller code 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    //... 
    variablesViewPane.maxHeightProperty().bind(leftVBox.heightProperty()); 
    historyViewPane.maxHeightProperty().bind(leftVBox.heightProperty()); 
    } 
} 

हम प्रत्येक फलक के expandedProperty() करने के लिए बाध्य है, और गतिशील रूप से बाँध और prefHeighProperty() निकल:

private static void bindExpanded(TitledPane pane, ReadOnlyDoubleProperty prop) { 
    pane.expandedProperty().addListener((observable, oldValue, newValue) -> { 
    if(newValue) { 
     pane.prefHeightProperty().bind(prop); 
    } else { 
     pane.prefHeightProperty().unbind(); 
     pane.prefHeightProperty().set(0); 
    } 
    }); 

}

यदि हमें दिखाया गया है, तो हम वीबीओक्स के रूप में बड़े होने के लिए कहते हैं, अगर हम हैं दिखाया नहीं गया है, हम जितना संभव हो उतना छोटा होने के लिए कहते हैं। इस तरह से काम करने का लाभ यह है कि लेआउट ने स्वचालित रूप से दिखाए गए टाइटलस्पेन की संख्या के आधार पर स्वचालित ऊंचाई की गणना की - जो वास्तव में हमारे इच्छित व्यवहार की ओर जाता है।

मैं यहाँ और अधिक विस्तार में जाने: अपने नमूने के लिए

http://sebastianaudet.com/blog/playing-with-javafx/