JavaFX

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

Eigene Werkzeuge
Werkzeuge

gratis Counter by GOWEB
seit 9.10.2007