Accordion, alle offen
Das JavaFX Accordion kann immer nur ein Element zur Zeit öffnen. Mit wenig Aufwand lässt sich ein eigenes Accordion entwickeln, bei welchem mehrere/alle Elemente offen sein können:
Eine einfache Variante, die auf das Wesentliche beschränkt ist:
package com.sowas.javawiki.javafx; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TitledPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class MyFxApplication extends Application { @Override public void start(Stage mainStage) { mainStage.setTitle("JavaFX-Accordion"); VBox vBox = new VBox(); vBox.getChildren().add(new TitledPane("View 1", new Label("1"))); vBox.getChildren().add(new TitledPane("View 2", new Label("2"))); vBox.getChildren().add(new TitledPane("View 3", new Label("3"))); Scene scene = new Scene(vBox); mainStage.setScene(scene); mainStage.show(); } public static void main(String[] args) { launch(args); } }
Eine Accordion-Klasse, die (ein bisschen) kompatibel zur JavaFX-Klasse Accordion ist:
package com.sowas.javawiki.javafx; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.scene.control.ScrollPane; import javafx.scene.control.TitledPane; import javafx.scene.layout.VBox; import java.util.List; public class MultiOpenAccordion extends ScrollPane { private ObservableList<TitledPane> panes = FXCollections.observableArrayList(); VBox vBox = new VBox(); public NavigatorAccordion() { // Falls keine horizontale Scrollleiste gewünscht ist, muss die Breite der VBox // and die ScrollPane angepasst werden: widthProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { vBox.setMinWidth(newValue.doubleValue()); vBox.setPrefWidth(newValue.doubleValue()); vBox.setMaxWidth(newValue.doubleValue()); } }); setHbarPolicy(ScrollBarPolicy.NEVER); // Änderungen an der Liste werden hier behandelt: panes.addListener((ListChangeListener<TitledPane>) c -> { while (c.next()) { if (c.wasAdded()) { vBox.getChildren().addAll(c.getAddedSubList()); } if (c.wasRemoved()) { vBox.getChildren().removeAll(c.getRemoved()); } if (c.wasReplaced()) { } if (c.wasUpdated()) { } if (c.wasPermutated()) { } } }); setContent(vBox); } public List<TitledPane> getPanes() { return panes; } public void setExpandedPane(TitledPane expandedPane) { expandedPane.setExpanded(true); } }
Eine Verwendung der Klasse könnte so aussehen:
MultiOpenAccordion moAccordion = new MultiOpenAccordion(); moAccordion.add(new TitledPane("Test 1", new Label("1"))); moAccordion.add(new TitledPane("Test 2", new Label("2"))); moAccordion.add(new TitledPane("Test 3", new Label("3")));
Stichworte:
JavaFX Accordion, alle offen, mehere gleichzeitig offen, Beispiel