2012-05-01 19 views
7

JavaFX 2.1のアコーディオンが完全に折り畳まれるのを防ぐ簡単な方法はありますか?私はいくつかのエントリを持つアコーディオンを持っていますが、ユーザがアクティブなアコーディオンエントリをクリックすると、アコーディオンが崩壊します。JavaFXのアコーディオンが折りたたまれないようにする

私はおそらく、マウスのクリックリスナーを使ってチェックを行い、それに応じて行動することができますが、これは達成するよりもさらに単純なように感じます。

+1

このためのJavaFX-JIRAの機能要求が用意されました[#RT-28141](http://javafx-jira.kenai.com/browse/RT-28141) – drzymala

答えて

7

現在展開されているアコーディオンペインにリスナーを追加し、折りたたみ可能なプロパティを変更してユーザーが折り畳まないようにします。ここで

は、サンプルアプリです:

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

崩壊のプロパティを使用すると無効になりますアニメーション – Strassenrenner

2

ここでアコーディオンが完全に崩壊することはないと確信して作るためのもう一つのソリューションです。 @jewelseaによる大きなオリジナルの答えとの違いはほとんどありません。デフォルトの下向きの矢印が開いたアコーディオンのTitledPaneの顔から消えていたという事実が気に入らなかったのは、その折りたたみ可能なプロパティがfalseに設定されているからです。私は自分のインターフェースにもっと自然な感じを出すためにもう少し試してみました。

/* 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); 
      }); 
     } 
    }); 
関連する問題