2012-05-15 3 views
6

JavaFX2의 TableView 기능 "런타임에 사용자가 열을 다시 정렬합니다". 내 응용 프로그램의 특정 테이블에 대해이 기능을 비활성화하고 싶습니다.JavaFX2 TableView에서 열 순서 변경을 비활성화하는 방법은 무엇입니까?

API 문서를 보면 명백한 API 훅이 없습니다. 그러나 columns- 속성이 있습니다. 문서에 따르면,

이 TableView의 일부인 TableColumns를 나타냅니다. 사용자가 TableView 열을 재정렬하면이 목록이 현재 시각적 순서를 반영하도록 업데이트됩니다.

변경이 발생하면 적어도 재설정을 수행 할 수 있기를 기대하면서 사실 이후 변경 사항을 재설정하기 위해 리스너를 추가하려고 시도했습니다. 내가 wasPermutated를 요청할 때

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(); 
    } 
} 

그러나, 리스너는 IllegalStateException으로 중단됩니다.
재정렬을 방지하거나 최소한 프로그래밍 방식으로 되돌릴 수 있습니까?

+0

방금 ​​그 방법을 시도했고 열을 이동할 때'onChanged' 메서드가 호출됩니다. 그러나 나는 change.wasPermutated()에서 IllegalStateException을 얻는다. – assylias

+0

이 경우, 제 코드가 너무 복잡했을 것입니다. 최소한의 예를 설정하고 거기에서 계속하겠습니다. –

+1

그냥 내 대답을 편집하고 일종의 작품. 상태를 확인하기 전에'change.next()'를 먼저 호출해야합니다. + 이동하는 열은 순열이 아닌 추가로 플래그를 설정하는 것 같습니다 ... – assylias

답변

8

아래를 보면 리스너가 호출 된 것을 보여주는 SSCCE가 있지만 열을 이동하면 플래그가 added으로 설정됩니다. 변경을 사용하기 전에 next()에 전화해야합니다. 그렇지 않으면 IllegalStateException이됩니다. 간단한 표준 예는 javadoc of ListChangeListener.Change을 참조하십시오.

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

귀하의 의견에 감사 드리며, 현재 샘플이 있습니다. 내 코드가 귀하의 코드보다 간결하며 질문에 더 잘 대답 할 수 있다고 생각합니다. 그러나 솔루션을 귀사에 귀속시키고 싶습니다. 대답을 편집하여 코드를 표시하고 승인 된 것으로 표시하면 괜찮습니까? –

+0

@UrsReupke 물론 - 내 대답은 부분적입니다 - 당신이 대답을 게시하고 원한다면 받아 들여야합니다. – assylias

+0

광산을 편집하거나 새로 만들 수 있습니다 - 통화. – assylias

관련 문제