2012-05-01 11 views
7

C'è un modo semplice per impedire che una fisarmonica in JavaFX 2.1 si stacchi completamente? Ho una fisarmonica con alcune voci, ma se l'utente fa clic sulla voce fisarmonica attiva crolla la fisarmonica.Impedire il crollo di una fisarmonica in JavaFX

Probabilmente potrei usare un ascoltatore di clic del mouse per controllare il controllo e agire di conseguenza, ma questo sembra che dovrebbe essere ancora più semplice di quello da realizzare.

+1

V'è ora una richiesta di funzionalità su JavaFX-jira per questo [# RT-28141] (http://javafx-jira.kenai.com/browse/RT-28141) – drzymala

risposta

7

Aggiungi un listener al riquadro della fisarmonica attualmente espanso e impedisci che venga compresso dall'utente modificando la sua proprietà collassabile.

Ecco un'applicazione di esempio:

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

Usando la proprietà crollo disabilita la animazione – Strassenrenner

2

Ecco un'altra soluzione per fare in modo la fisarmonica sarà mai completamente crollare. La differenza rispetto alla grande risposta originale di @jewelsea è poco - non mi piaceva il fatto che la freccia predefinita rivolta verso il basso stesse scomparendo dalla facciata TitledPane della fisarmonica aperta, perché la sua proprietà "collassabile" veniva impostata su false. Ho giocato un po 'di più per ottenere una sensazione più "naturale" per la mia interfaccia.

/* 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); 
      }); 
     } 
    }); 
Problemi correlati