2013-07-17 39 views
11

アイデアは:N列のTableViewで、水平スクロールを使用しても常に最初のM列が表示されるようにする。JavaFX、TableViewのいくつかの列の位置をフリーズする方法

私の要件の近くの唯一のものはBinding two tableviews together such that they scroll in syncです。 2つのテーブルを並べて並べるという考え方は、私の視点では最善ではありません。

1)同じobservableListを使用すると、列が並べ替えられます少なくとも1つの列が同じテーブルにない複数の列の並べ替えはできません
2)マウスホイールまたは矢印キーとの同期スクロールがありません

おそらく、 EventHandlersとListenersを使用してこれらの問題に対処できますが、1つのテーブルだけを使用することができることを願っています。

質問:私が探している振る舞いを持つためにTableViewまたはTableColumnsに設定可能なプロパティがありますか?

答えて

2

ですから、問題は:TableViewまたはTableColumnsに設定可能なプロパティがあり、私が探している動作があるかどうかです。

どうやら

ないが、JavaFXのはJiraでこの動作のための機能要求がある(あなたはそれを見るために登録する必要があります):

https://javafx-jira.kenai.com/browse/RT-19454

私はあなたがそれに投票示唆しています。 :^)

3

現在、このような機能はありません。実際、スクロールバーを操作してスクロールバーイベントに応答することさえ問題である。私は考えることができる2つのオプション: - :

<BorderPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
    <bottom> 
    <ScrollBar fx:id="hScroll" /> 
    </bottom> 
    <center> 
    <HBox fx:id="varTable" prefHeight="100.0" prefWidth="200.0"> 
     <children> 
     <TableView fx:id="fixedTable" prefHeight="200.0" prefWidth="200.0"> 
      <columns> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      </columns> 
     </TableView> 
     <TableView prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS"> 
      <columns> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      <TableColumn prefWidth="75.0" text="Column X" /> 
      </columns> 
     </TableView> 
     </children> 
    </HBox> 
    </center> 
    <right> 
    <ScrollBar fx:id="vScroll" orientation="VERTICAL" /> 
    </right> 
</BorderPane> 

オプション#1の複数の表

、2回の表と以下のFXMLスニペットのように2つのスクロールバーを含む新しいレイアウトを作成します。 2番目のタブにはHBox.hgrow = "ALWAYS"が設定されています。

テーブルビューのスクロールバー検索する機能を書く:

private static final ScrollBar getScrollBar(final TableView<?> tableView) { 
    for (final VirtualFlow virtualFlow: Nodes.filter(Nodes.descendents(tableView, 2), VirtualFlow.class)) { 
    for (final Node subNode: virtualFlow.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && ((ScrollBar)subNode).getOrientation() == Orientation.VERTICAL) { 
      return (ScrollBar)subNode; 
     } 
    } 
    } 

    return null; 

}

などMIN、MAX、値のように(2垂直スクロールバーの位置を特定し、そのプロパティをバインドするためにこれを使用します)を独自の垂直スクロールバーに追加し、元のスクロールバーを非表示にします。また、レイアウトでスペースを取らないように、managed = falseを設定する必要があります。

水平スクロールバーを配置して非表示にし、「移動」テーブル水平スクロールバーのプロパティを独自の水平スクロールバーにバインドします。

this Jiraが修正されるのを待つ間に、このテクニックを使用して2つのテーブルを1つのスクロールバーでリンクすることができます。

オプション#2 - 書くあなた自身のTableViewSkin 彼らは皮膚をどうかを確認するJavaFXのソースをダウンロードして、あなたは完全なカスタムスキンを作成するか、2つの正規スキンを包む皮を書き、中に実装することができますいずれか上記のオプション1と同様の方法

1

JavaFXにはこの機能がありません。 ControlsFXのSpreadsheetViewをチェックしてください。

2

javafxテーブルビューでカラムをフリーズすることができます。カスタムテーブルカラムクラスを作成する必要があります。ここでは、カラムを固定にするために使用される2つのメソッドsetFixedisFixedがあります。

これとは別に、あなたは

  1. TableViewskin

  2. TableHeaderRow独自に作成する必要があります - 基本的には、このクラスでは、あなたはgetRootHeader()方法

  3. NestedTableColumnHeaderオーバーライドする必要がある - このクラスのオーバーライドでのlayoutChildren()メソッドを追加し、新しいメソッドをレイアウトに追加するfixedColumns
  4. VirtualFlow
  5. TableViewからfixedTableColumn
  6. TableRowのための新しいbooleanProperty showColumnHeaderと1 ObservableArrayListを追加し、createDefaultSkin()を上書き - createDefaultSkin()
  7. TableRowSkinBaseをオーバーライド - 固定列を処理するためのlayoutChildren()メソッドをオーバーライドします。
関連する問題