2013-03-13 11 views

答えて

31

いいえ、JavaFX 2.2 Accordionは、一度に1つの開いているペインしか持つことができません。

一度に複数のペインをアコーディオンで開くことができる機能の拡張リクエスト(JDK-8090554 StackedTitledPanes control)を作成しましたが、機能リクエストは現在実装されていません。

一方、複数のTitledPaneインスタンスを作成してVBoxに配置することで、同様のコントロールを簡単に作成できます。

private VBox createStackedTitledPanes() { 
    final VBox stackedTitledPanes = new VBox(); 
    stackedTitledPanes.getChildren().setAll(
    new TitledPane("Pane 1", contentNode1), 
    new TitledPane("Pane 2", contentNode2), 
    new TitledPane("Pane 3", contentNode3) 
); 
    ((TitledPane) stackedTitledPanes.getChildren().get(0)).setExpanded(true); 

    return stackedTitledPanes; 
} 

必要であれば、その領域が使用可能な領域をオーバーフローした場合、あなたの拡大ペインのすべての内容が使用可能であることができるように、あなたは、ScrollPaneであなたのペインを含むVBoxをラップすることができます。

私はsample solutionを作成しました(アイコンは、リンクウェアはhttp://www.fasticon.comです)。埋め込みビューのための

fishyfishy

+0

こんにちは、あなたのサンプルのための感謝を。それは私にとってはうまくいくでしょう。 – sight

+0

機能リクエストリンクがもう機能しません。 –

+0

はい、JavaFX固有のjira問題追跡システムは廃止されました。私が知る限り、そのシステムからの問題と機能要求は、公式のJDKの問題追跡システムに転送されましたが、そのシステムで関連する問題を見つける方法やリンクする方法がわかりません。このコントロールの公式のJDK機能リクエストプロセスを行うのではなく、[third party ControlsFX library](http://fxexperience.com/controlsfx/)の開発者に連絡し、StackedTitledPanesコントロールを追加することに興味があるかどうかを確認することをお勧めします彼らの図書館。 – jewelsea

0

私はわずかに異なる要件

  1. を持っていたアコーディオンは、ビュー空間を展開または管理のいずれか
  2. ビュー全体が
  3. スクロールビューに入れることができ、すべてボックスは、アコーディオンが固定サイズの場合は全体ビューのサイズに完全に展開され、固定ビューでない場合はコンテンツのサイズに展開されます。

私の場合、私は、次の修正を思い付くことができた、3及びテスト2の全てを満たすことができませんでしたが:VBoxので、ScrollPaneのを使用してください)

1内側にはTitledWindowsがあります。 2)TitledPanesがVBox.grow = "SOMETIMES"に設定されていることを確認してください。 3)VBoxを最後の要素として追加し、VBox.vgrow = "ALWAYS"を設定します。これにより、TitledPanesを最小サイズにプッシュします。他のみんなは(SceneBuilderで生成された)あなたはFXMLを使用したい、またはJavaを使用したくない場合は、単に要素を使用すると、直接同じようにうまく動作し、コード例を提供しています

<ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
    <content> 
     <VBox fx:id="leftVBox" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="100.0"> 
      <children> 
       <TitledPane fx:id="titledPanelOne" animated="false" expanded="false" style="-fx-background-color: red;" text="Pane One" VBox.vgrow="SOMETIMES"> 
       <content> 
        <ListView fx:id="listViewOne" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> 
       </content> 
       </TitledPane> 
       <TitledPane fx:id="titledPanelTwo" animated="false" expanded="false" style="-fx-background-color: green;" text="Pane Two" VBox.vgrow="SOMETIMES"> 
       <content> 
        <ListView fx:id="listViewTwo" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" /> 
       </content> 
       </TitledPane> 
       <VBox prefHeight="0.0" prefWidth="0.0" VBox.vgrow="ALWAYS" /> 
      </children> 
     </VBox> 
    </content> 
</ScrollPane> 

4)、これはありませんが、互いに独立して展開/縮小する積み重ねボックスを取得します。これは、コンテンツに適切にサイズ変更されないボックス(たとえば、上の例のようにリストビューが埋め込まれている場合)を持つ問題を修正するものではありません。スクリーンの不動産がたくさん残っていると、スクロールする必要があります。ソリューション? Javaのビットが必要です。

この修正プログラムを実装するために、我々は最初のTitledPaneのmaxHeightProperty()外のVBoxのheightProperty()をバインド:

public class Controller implements Initializable { 
    //... controller code 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    //... 
    variablesViewPane.maxHeightProperty().bind(leftVBox.heightProperty()); 
    historyViewPane.maxHeightProperty().bind(leftVBox.heightProperty()); 
    } 
} 

ザ・私たちは、各ペインのexpandedProperty()に結合し、かつ動的にprefHeighProperty()を結合して、アンバインド:

private static void bindExpanded(TitledPane pane, ReadOnlyDoubleProperty prop) { 
    pane.expandedProperty().addListener((observable, oldValue, newValue) -> { 
    if(newValue) { 
     pane.prefHeightProperty().bind(prop); 
    } else { 
     pane.prefHeightProperty().unbind(); 
     pane.prefHeightProperty().set(0); 
    } 
    }); 

}

表示されている場合は、VBoxと同じ大きさにする図示されていないが、できるだけ小さくするように求める。このようにすることの利点は、レイアウトが、現在表示されているTitledPaneの数に基づいて利用可能な高さを自動的に計算して、われわれが望む動作に正確に導くことです。

私はここでは詳細に入る:

http://sebastianaudet.com/blog/playing-with-javafx/

関連する問題