2017-02-24 2 views
1

표 머리글을 마우스로 클릭하는 방법이 있습니까?JavaFX TableView 머리글 클릭

왜 내가 필요한가?

많은 열이 포함 된 표가 있습니다. 그러나 표 전체에 대해서만 구체적입니다. 스크롤을 피하려면 각 열에 특정 너비 (50 정도)를 지정하고 머리글을 클릭하기 만하면이 열이 확장되어 내용을 읽을 수 있습니다. 다른 헤더를 클릭하면 이전 헤더가 축소됩니다.

희망 누군가가 나를 도울 수 :

답변

1

을 불행하게도이 작업을 수행 할 수있는 좋은 방법이 아니다. 유일한 공개 API 옵션은 열의 "그래픽"을 자신의 레이블로 바꾸고 그 위에 마우스 수신기를 추가하는 것입니다. 이 기능을 사용하려면 기존 열 텍스트를 지워야합니다. 기본적으로 열을 정렬 구현하는 청취자를 클릭하여이

주, 당신이 또한 column.setSortable(false)

@Override 
public void start(Stage primaryStage) throws Exception { 
    TableView<String> tableView = new TableView<>(); 
    TableColumn<String, Object> x = new TableColumn<>("x"); 
    tableView.getColumns().add(x); 
    TableColumn<String, Object> y = new TableColumn<>(""); 
    tableView.getColumns().add(y); 

    x.setSortable(false); 
    y.setSortable(false); 

    makeHeader(x, "X", 0); 
    makeHeader(y, "Y", 1); 

    EventHandler<? super MouseEvent> handler = event -> { 
     System.out.println("Column clicked " + ((Node)event.getTarget()).getProperties().get("index")); 
    }; 
    x.getGraphic().addEventFilter(MouseEvent.MOUSE_CLICKED, handler); 
    y.getGraphic().addEventFilter(MouseEvent.MOUSE_CLICKED, handler); 
    primaryStage.setScene(new Scene(tableView)); 
    primaryStage.show(); 
} 

private void makeHeader(TableColumn<?, ?> target, String name, int index) { 
    VBox vBox = new VBox(new Label(name)); 
    vBox.setAlignment(Pos.CENTER); 
    vBox.getProperties().put("index", index); 
    target.setGraphic(vBox); 
    target.setText(""); 
} 
+0

밤은 좋은를 호출해야하므로,이 동작을하지 않을 것 같다,하지만 작동합니다 . 유일한 문제는 지금 모든 열에 대해 이벤트를 만들고 싶지 않다는 것입니다. 이벤트 내부에서 열 인덱스를 가져올 수 있습니까? "X 클릭 한"대신 뭔가가 필요합니다 .getIndex() + "클릭 한". – Hesk

+0

@Hesk 업데이트 된 답변보기. 나는 모든 노드가 가진 사용자 정의 속성 맵에 인덱스를 저장하고 공유 이벤트 핸들러에서 검색했습니다. – Adam

+0

다른 방법으로 테이블을 디자인했습니다. 지금 사용 : http://stackoverflow.com/questions/27739833/adapt-tableview-menu-button (Post vom Balage1551 게시) – Hesk

0
// Step 1: Add a click listener to the table view. 
tableView.setOnMouseClicked(new EventHandler<>() { 

    @Override 
    public void handle(MouseEvent event) { 
    // Step 2: Get the height of the header. 
    double headerHeight = tableView.lookup(".column-header-background").getBoundsInLocal().getHeight(); 

    // Step 3: Check if the clicked position's Y value is less than or equal to the height of the header. 
    if (headerHeight <= event.getY()) { 
     // Clicked on the header! 
    } 
    } 
});