Frage an accordion, javafx-2 – Verhindern Sie, dass ein Akkordeon in JavaFX zusammenbricht

8

Gibt es eine einfache Möglichkeit zu verhindern, dass ein Akkordeon in JavaFX 2.1 vollständig zusammenbricht? Ich habe ein Akkordeon mit einigen Einträgen, aber wenn der Benutzer auf den aktiven Akkordeoneintrag klickt, wird das Akkordeon ausgeblendet.

Ich könnte wahrscheinlich einen Mausklick-Listener verwenden, um die Überprüfung durchzuführen und entsprechend zu handeln, aber dies scheint noch einfacher zu sein.

Es gibt jetzt eine Feature-Anfrage für javafx-jira# RT-28141 drzymala

Deine Antwort

2   die antwort
4

Hier ist eine andere Lösung, um sicherzustellen, dass das Akkordeon niemals vollständig zusammenbricht. Der Unterschied zu der großartigen ursprünglichen Antwort von @jewelsea ist gering - mir hat die Tatsache nicht gefallen, dass der nach unten gerichtete Standardpfeil von der offenen Akkordeon-TitledPane-Fläche verschwand, weil die Eigenschaft "collapsible" auf false gesetzt ist. Ich habe ein bisschen mehr damit gespielt, um ein "natürlicheres" Gefühl für meine Benutzeroberfläche zu erzielen.

<code>    /* Make sure the accordion can never be completely collapsed */
    accordeon.expandedPaneProperty().addListener((ObservableValue<? extends TitledPane> observable, TitledPane oldPane, TitledPane newPane) -> {
        Boolean expand = true; // This value will change to false if there's (at least) one pane that is in "expanded" state, so we don't have to expand anything manually
        for(TitledPane pane: accordeon.getPanes()) {
            if(pane.isExpanded()) {
                expand = false;
            }
        }
        /* Here we already know whether we need to expand the old pane again */
        if((expand == true) && (oldPane != null)) {
            Platform.runLater(() -> {
                accordeon.setExpandedPane(oldPane);
            });
        }
    });
</code>
8

Fügen Sie dem aktuell erweiterten Akkordeonbereich einen Listener hinzu und verhindern Sie, dass er vom Benutzer komprimiert wird, indem Sie die komprimierbare Eigenschaft ändern.

Hier ist eine Beispiel-App:

<code>import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class AccordionSample extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage primaryStage) {
    // create some titled panes to go in an accordion.
    TitledPane adminPane = new TitledPane("Animals", 
      VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
        ButtonBuilder.create().text("Zebra").maxWidth(Double.MAX_VALUE).build(),
        ButtonBuilder.create().text("Shrew").maxWidth(Double.MAX_VALUE).build()
      ).build()            
    );
    TitledPane viewPane = new TitledPane("Vegetables", 
      VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
        ButtonBuilder.create().text("Eggplant").maxWidth(Double.MAX_VALUE).build(),
        ButtonBuilder.create().text("Carrot").maxWidth(Double.MAX_VALUE).build()
      ).build()            
    );

    // create an accordion, ensuring the currently expanded pane can not be clicked on to collapse.
    Accordion accordion = new Accordion();
    accordion.getPanes().addAll(adminPane, viewPane);
    accordion.expandedPaneProperty().addListener(new ChangeListener<TitledPane>() {
      @Override public void changed(ObservableValue<? extends TitledPane> property, final TitledPane oldPane, final TitledPane newPane) {
        if (oldPane != null) oldPane.setCollapsible(true);
        if (newPane != null) Platform.runLater(new Runnable() { @Override public void run() { 
          newPane.setCollapsible(false); 
        }});
      }
    });
    for (TitledPane pane: accordion.getPanes()) pane.setAnimated(false);
    accordion.setExpandedPane(accordion.getPanes().get(0));

    // layout the scene.
    StackPane layout = new StackPane();
    layout.setStyle("-fx-padding: 10; -fx-background-color: cornsilk;");
    layout.getChildren().add(accordion);
    primaryStage.setScene(new Scene(layout));
    primaryStage.show();
  }
}
</code>
Mit der Eigenschaft collapse wird die Animation deaktiviert Strassenrenner

Verwandte Fragen