2013-03-13 12 views

Odpowiedz

31

Nie, JavaFX 2.2 Accordion może mieć tylko jedno otwarte okienko na raz.

Utworzono żądanie rozszerzenia (JDK-8090554 StackedTitledPanes control) dla funkcji, która pozwala na otworzenie więcej niż jednego panelu na akordeonie naraz, jednak żądanie obiektu nie zostało jeszcze zaimplementowane.

W międzyczasie można łatwo zbudować podobną kontrolę, tworząc wiele instancji TitledPane i umieszczając je w postaci 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; 
} 

Jeśli to konieczne, można owinąć VBox zawierający swoje okienka w ScrollPane, tak że zawartość wszystkich rozbudowanych szyb może być użyteczny, jeśli ich powierzchnia przelewa dostępną powierzchnię.

Utworzono sample solution (ikony są łączem z: http://www.fasticon.com).

fishyfishy

+0

Cześć, dzięki za próby. To dla mnie zadziała. – sight

+0

Link do funkcji łącza nie działa. –

+0

Tak, system śledzenia problemów Jira dla JavaFX został przerwany. O ile mi wiadomo, problemy i propozycje funkcji z tego systemu zostały przeniesione do oficjalnego systemu śledzenia problemów JDK, ale nie wiem, jak znaleźć lub powiązać związany z tym problem w tym systemie. Zamiast przechodzić przez oficjalny proces żądania funkcji JDK dla tej kontroli, radzę skontaktować się z programistami [trzeciej strony ControlsFX] (http://fxexperience.com/controlsfx/) i sprawdzić, czy mają jakiekolwiek zainteresowanie dodaniem kontrolki StackedTitledPanes do ich biblioteka. – jewelsea

0

miałem nieco inne wymogi

  1. Akordeon albo rozszerza lub zarządza przestrzeń widok dla osadzonych poglądów
  2. Cały widok może być umieszczone w widoku przewijania
  3. Every pole całkowicie rozszerza się do rozmiaru całego widoku, jeśli akordeon ma ustalony rozmiar lub rozszerza się do rozmiaru treści, jeśli nie jest to stały widok.

Chociaż w moim przypadku, nie był w stanie spełnić wszystkie 3. i 2. badania, udało mi się wymyślić następującej poprawki:

1) używać ScrollPane, z VBox wewnątrz, z wewnątrz TitledWindows. 2) Upewnij się, że twoje zestawy TitledPanes są ustawione na VBox.grow = "SOMETIMES". 3) Dodaj VBox jako ostatni element i ustaw VBox.vgrow = "ZAWSZE" - to popycha TitledPanes do ich minimalnego rozmiaru. Wszyscy dostarczył przykłady kodu, jeśli chcesz używać fxml, lub nie chcą korzystać z Java, tylko z wykorzystaniem elementów bezpośrednio działa tak samo dobrze (generowane z 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), chociaż to robi dostaniecie skumulowane pudełka, które rozszerzają/kurczą się niezależnie od siebie, to nie rozwiązuje problemu, w którym znajdują się pola, które nie zmieniają odpowiednio rozmiaru do ich zawartości (jeśli na przykład masz widok listy osadzony jak w powyższym przykładzie), i więc musisz teraz przewinąć trochę, gdy pozostało wiele nieruchomych ekranów. Rozwiązanie? Wymagana jest odrobina Java.

celu realizacji tej poprawki, najpierw wiązało TitledPane na maxHeightProperty() do zewnętrznej Vbox w heightProperty() bind

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()); 
    } 
} 

The że wiąże się każdy panel na expandedProperty() i dynamicznie i rozpuszczać się 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); 
    } 
    }); 

}

Jeśli zostaliśmy pokazani, prosimy o bycie tak dużym jak VBox, jeśli jesteśmy nie pokazano, prosimy o bycie tak małym, jak to możliwe. Zaletą robienia rzeczy w ten sposób jest to, że układ automatycznie obliczył dostępną wysokość w oparciu o liczbę aktualnie wyświetlanych TitledPanes - co prowadzi do dokładnie takiego zachowania, jakie chcemy.

pójdę do bardziej szczegółowo tutaj:

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

Powiązane problemy