2013-07-17 51 views
11

Ý tưởng là: trên một TableView của N cột để có M cột đầu tiên luôn hiển thị ngay cả khi bạn sử dụng cuộn ngang.JavaFX, cách đóng băng vị trí của một số cột trong TableView

Điều duy nhất gần yêu cầu của tôi là Binding two tableviews together such that they scroll in sync. Ý tưởng để đặt cạnh nhau hai bảng không phải là tốt nhất theo quan điểm của tôi vì

1) Loại cột là một phần độc lập giữa hai bảng: nếu bạn sử dụng cùng một ObservableList, các hàng được sắp xếp theo cả hai bảng nhưng không thể sắp xếp trên nhiều cột có ít nhất một cột không nằm trên cùng một bảng
2) Không có cuộn đồng bộ nào với bánh xe chuột hoặc bằng các phím mũi tên

Tôi biết rằng, có thể , Tôi có thể đối phó với các vấn đề như thế này bằng cách sử dụng EventHandlers và Listeners nhưng tôi hy vọng nó có thể sử dụng chỉ có một bảng.

Vì vậy, câu hỏi đặt ra là: có bất kỳ thuộc tính có thể định cấu hình nào trên TableView hoặc TableColumn để có hành vi mà tôi đang tìm kiếm không?

Trả lời

2

Vì vậy, câu hỏi đặt ra là: có bất kỳ thuộc tính có thể định cấu hình nào trên TableView hoặc TableColumn để có hành vi mà tôi đang tìm không?

Rõ ràng không, nhưng có một yêu cầu tính năng cho hành vi này trên JavaFX Jira (bạn sẽ cần phải đăng ký để xem nó):

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

tôi đề nghị bạn bỏ phiếu cho nó. : ^)

3

Hiện không có tính năng nào như vậy. Trong thực tế, ngay cả thao tác trên thanh cuộn và trả lời các sự kiện thanh cuộn đều có vấn đề. Hai tùy chọn tôi có thể nghĩ:

Lựa chọn # 1 - Nhiều Bảng

Tạo một bố cục mới, trong đó có hai bảng và hai thanh cuộn như trong đoạn mã FXML dưới đây:

<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> 

Lưu ý tabe thứ hai có HBox.hgrow = "ALWAYS" được đặt.

Viết một chức năng để xác định vị trí các thanh cuộn trong một TableView:

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; 

}

Sử dụng này để xác định vị trí hai thanh cuộn dọc và liên kết tài sản của họ (như min, max, giá trị, vv) vào thanh cuộn dọc của riêng bạn rồi ẩn thanh cuộn ban đầu. Bạn cũng sẽ cần phải đặt managed = false để chúng không chiếm không gian trong bố cục.

Định vị và ẩn thanh cuộn ngang và liên kết các thuộc tính của thanh cuộn ngang bảng 'di chuyển' với thanh cuộn ngang của riêng bạn.

Chúng tôi đang thành công khi sử dụng kỹ thuật này để liên kết hai bảng với một thanh cuộn duy nhất trong khi đợi this Jira được sửa.

Lựa chọn # 2 - Viết của bạn TableViewSkin riêng Tải nguồn JavaFX để xem những gì họ làm với da và sau đó bạn có thể viết một làn da tùy chỉnh hoàn toàn hoặc viết thư da mà kết thúc tốt đẹp hai da thường xuyên và thực hiện trong một cách tương tự như Tùy chọn # 1 ở trên

1

JavaFX không có chức năng này. Xem Bảng tính Spreadsheet của ControlsFX.

2

Tôi có thể cố định cột trong chế độ xem bảng javafx. Chúng ta cần tạo lớp cột bảng tùy chỉnh, trong đó chúng ta sẽ có hai phương thức setFixedisFixed sẽ được sử dụng để làm cho một số cột được cố định.

Ngoài ra bạn cần tạo riêng của bạn

  1. TableViewskin

  2. TableHeaderRow - về cơ bản trong lớp này bạn cần phải ghi đè lên getRootHeader() phương pháp

  3. NestedTableColumnHeader - Trong lớp này ghi đè layoutChildren() và thêm phương pháp mới để bố cục fixedColumns
  4. VirtualFlow
  5. TableView - ghi đè createDefaultSkin(), thêm mới booleanProperty showColumnHeader và một ObservableArrayList cho fixedTableColumn
  6. TableRow - Override createDefaultSkin()
  7. TableRowSkinBase - ghi đè layoutChildren() phương pháp để xử lý các cột cố định.