2012-05-01 17 views
7

¿Hay alguna manera fácil de evitar que un acordeón en JavaFX 2.1 se colapse por completo? Tengo un acordeón con algunas entradas, pero si el usuario hace clic en la entrada del acordeón activo, colapsa el acordeón.Evitar que un acordeón en JavaFX se colapse

Probablemente podría usar un oyente de clic del mouse para verificar la verificación y actuar en consecuencia, pero parece que debería ser aún más simple de lograr.

+1

En la actualidad existe una solicitud de función en javafx-jira para esta [# RT-28141] (http://javafx-jira.kenai.com/browse/RT-28141) – drzymala

Respuesta

7

Agregue un detector al panel de acordeón actualmente expandido y evite que el usuario lo contraiga al modificar su propiedad contraíble.

Aquí es una aplicación de ejemplo:

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

Utilizando la propiedad desactiva el colapso animación – Strassenrenner

2

Aquí hay otra solución para asegurarse de que el acordeón no se derrumbará por completo. La diferencia con la gran respuesta original de @jewelsea es pequeña: no me gustó el hecho de que la flecha hacia abajo predeterminada desapareciera de la cara del título abierto del acordeón, porque su propiedad "contraíble" se está configurando como falsa. Jugué un poco más para lograr una sensación más "natural" para mi interfaz.

/* 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); 
      }); 
     } 
    }); 
Cuestiones relacionadas