2012-05-15 36 views
6

Các tính năng TableView của JavaFX2 "Cột sắp xếp lại theo người dùng khi chạy". Tôi muốn tắt tính năng này cho một bảng cụ thể trong Ứng dụng của tôi.Làm thế nào để vô hiệu hóa sắp xếp lại cột trong một TableView JavaFX2?

Nhìn vào tài liệu API, không có móc API rõ ràng cho việc này. Tuy nhiên, có columns -property. Theo tài liệu, nó đại diện cho

BảngColumn là một phần của TableView này. Khi người dùng sắp xếp lại các cột TableView, danh sách này sẽ được cập nhật để phản ánh thứ tự trực quan hiện tại.

Hy vọng rằng ít nhất tôi cũng có thể đặt lại thay đổi sau khi xảy ra, tôi đã thử thêm người nghe để đặt lại thay đổi sau khi thực tế.

import javafx.application.Application; 
import javafx.collections.ListChangeListener; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableTest extends Application { 

    public static void main(String[] args) { 
    launch(args); 
    } 


    @Override 
    public void start(Stage stage) { 
    TableView tableView = new TableView(); 
    tableView.getColumns().setAll(new TableColumn(), new TableColumn()); 
    tableView.getColumns().addListener(new ListChangeListener() { 
     @Override 
     public void onChanged(Change change) { 
      if (change.wasPermutated()){ 
       change.reset(); 
      } 
     } 
    }); 
    stage.setScene(new Scene(tableView)); 
    stage.show(); 
    } 
} 

Tuy nhiên, người nghe hủy bỏ IllegalStateException khi tôi yêu cầu wasPermutated.
Có cách nào để ngăn chặn sắp xếp lại hoặc ít nhất là hoàn nguyên chương trình không?

+0

Tôi vừa thử phương thức đó và phương thức 'onChanged' được gọi khi di chuyển các cột xung quanh. Tuy nhiên tôi nhận được một IllegalStateException trên 'change.wasPermutated()'. – assylias

+0

Trong trường hợp đó, mã của tôi có lẽ quá phức tạp. Tôi sẽ thiết lập một ví dụ tối thiểu và tiếp tục từ đó. –

+1

Chỉ cần chỉnh sửa câu trả lời của tôi và nó hoạt động. Trước tiên bạn cần phải gọi 'change.next()' trước khi kiểm tra trạng thái của nó + cột di chuyển dường như thiết lập cờ để thêm, không hoán vị ... – assylias

Trả lời

8

Xem bên dưới SSCCE cho biết người nghe được gọi - nhưng cờ được đặt thành added khi di chuyển cột. Lưu ý rằng bạn cần phải gọi next() trước khi sử dụng thay đổi hoặc bạn sẽ nhận được IllegalStateException. Xem javadoc of ListChangeListener.Change để có ví dụ điển hình đơn giản.

import javafx.application.Application; 
import javafx.collections.ListChangeListener; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableTest extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
    final TableView tableView = new TableView(); 
    final TableColumn[] columns = {new TableColumn("1"), new TableColumn("2")}; 
    tableView.getColumns().setAll(columns); 
    tableView.getColumns().addListener(new ListChangeListener() { 
     public boolean suspended; 

     @Override 
     public void onChanged(Change change) { 
      change.next(); 
      if (change.wasReplaced() && !suspended) { 
       this.suspended = true; 
       tableView.getColumns().setAll(columns); 
       this.suspended = false; 
      } 
     } 
    }); 
    stage.setScene(new Scene(tableView)); 
    stage.show(); 
    } 
} 
+0

Nhờ nhận xét của bạn, tôi hiện có mẫu đang hoạt động. Mã của tôi ngắn gọn hơn của bạn và tôi cảm thấy nó tốt hơn câu trả lời cho câu hỏi, nhưng tôi muốn thuộc tính giải pháp cho bạn. Có ổn không nếu tôi chỉnh sửa câu trả lời của bạn để hiển thị mã của tôi và đánh dấu nó là được chấp nhận? –

+0

@UrsReupke Chắc chắn - câu trả lời của tôi chỉ là một phần - bạn nên đăng câu trả lời của bạn và chấp nhận nó nếu nó làm những gì bạn muốn. – assylias

+0

Bạn có thể chỉnh sửa hoặc tạo một cuộc gọi mới - cuộc gọi của bạn. – assylias

Các vấn đề liên quan