2013-03-13 16 views

Antwort

31

Nein, ein JavaFX 2.2 Accordion kann immer nur einen offenen Fensterbereich haben.

Ich habe eine Verbesserungsanforderung (JDK-8090554 StackedTitledPanes control) für eine Funktion erstellt, mit der Sie mehr als ein Fenster im Akkordeon gleichzeitig öffnen können, die Funktion wurde jedoch noch nicht implementiert.

In der Zwischenzeit können Sie ein ähnliches Steuerelement ganz einfach selbst erstellen, indem Sie mehrere TitledPane Instanzen erstellen und diese in eine VBox platzieren.

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

Bei Bedarf können Sie die VBox mit Ihren Scheiben in einem ScrollPane wickeln, so dass der Inhalt aller Ihrer erweiterten Scheiben verwendbar sein können, wenn ihre Fläche die verfügbare Fläche überläuft.

Ich habe eine sample solution erstellt (Symbole sind Linkware von: http://www.fasticon.com).

fishyfishy

+0

Hallo, vielen Dank für Ihre Probe. Es wird für mich ganz gut funktionieren. – sight

+0

Feature Request Link funktioniert nicht mehr. –

+0

Ja, das JavaFX-spezifische Jira-Problemverfolgungssystem wurde eingestellt. Soweit ich weiß, wurden die Probleme und Feature Requests von diesem System auf das offizielle JDK-Problemverfolgungssystem übertragen, aber ich weiß nicht, wie ich das zugehörige Problem in diesem System finden oder verlinken kann. Anstatt den offiziellen JDK-Featureanforderungsvorgang für dieses Steuerelement auszuführen, rate ich Ihnen, sich an die Entwickler von [Drittanbieter-ControlsFX-Bibliothek] (http://fxexperience.com/controlsfx/) zu wenden, um zu erfahren, ob sie ein StackedTitledPanes-Steuerelement hinzufügen möchten ihre Bibliothek. – jewelsea

0

hatte ich verschiedene Anforderungen leicht

  1. Das Akkordeon entweder erweitert oder verwaltet den Betrachtungsraum für die eingebetteten Ansichten
  2. Die gesamte Ansicht in eine Bildlaufansicht genommen werden kann
  3. Jeder Box wird vollständig auf die Größe der gesamten Ansicht erweitert, wenn das Akkordeon eine feste Größe hat, oder es wird auf die Größe des Inhalts erweitert, wenn es sich nicht um eine feste Ansicht handelt.

Obwohl in meinem Fall war ich 2. alle 3 und Test zu erfüllen nicht in der Lage, ich in der Lage war, mit dem folgende Update zu kommen:

1) Verwenden Sie eine ScrollPane, mit einem VBox innen, mit TitledWindows drinnen. 2) Stellen Sie sicher, dass Ihre TitledPanes auf VBox.grow = "SOMETIMES" festgelegt sind. 3) Füge eine VBox als letztes Element hinzu und setze VBox.vgrow = "IMMER" - dies bringt die TitledPanes auf ihre minimale Größe. Jeder andere hat Code-Beispiele zur Verfügung gestellt, wenn Sie fxml verwenden möchten, oder nicht wollen, Java verwenden, um nur die Elemente direkt funktioniert genauso gut mit (erzeugt mit 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) Obwohl dies tut Erhalten Sie gestapelte Boxen, die unabhängig voneinander expandieren/kontrahieren, das behebt nicht das Problem, wo Sie Boxen haben, die nicht richtig an ihren Inhalt anpassen (wenn Sie beispielsweise eine Listenansicht wie im obigen Beispiel eingebettet haben), und Sie müssen also ziemlich lange scrollen, wenn noch genug Bildschirmfläche vorhanden ist. Die Lösung? Ein bisschen Java ist erforderlich.

dieses Update implementieren wir die TitledPane ersten binden maxHeightProperty() an den heightProperty() des äußeren VBox:

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

Die wir an jede Scheibe des binden expandedProperty() und binden und lösen dynamisch die 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); 
    } 
    }); 

}

Wenn wir angezeigt werden, bitten wir, so groß wie die VBox zu sein, wenn wir es sind nicht gezeigt, bitten wir, so klein wie möglich zu sein. Der Vorteil dieser Vorgehensweise besteht darin, dass das Layout dann automatisch die verfügbare Höhe basierend auf der Anzahl der aktuell angezeigten Titelbereiche berechnet - was genau zu dem von uns gewünschten Verhalten führt.

Ich gehe mehr ins Detail hier:

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