2017-12-17 34 views
3

표시된 열의 너비가 항상 테이블 자체의 너비와 동일하다는 점에서 TableView에 대한 사용자 지정 크기 조정 정책을 TableView.CONSTRAINED_RESIZE_POLICY과 비슷하게 작성했습니다.열 머리글의 구분선을 두 번 클릭했을 때 CustomResizePolicy가 실행되지 않음

크기가 조정되는 테이블이나 사용자가 열을 끌어서 열의 크기를 조정할 때마다 크기 조정 정책이 호출되고 열의 크기가 적절하게 조정됩니다.

그러나 표의 머리글에있는 구분선 중 하나를 두 번 클릭하면 (열의 내용을 "줄 바꿈"하기 위해) 사용자 지정 크기 조정 정책이 트리거되지 않습니다.

결과적으로 열의 너비가 테이블 너비보다 크거나 작을 수 있습니다. 좋지 않습니다.

이 두 번의 클릭을 어떻게 감지하여 내 CustomResizePolicy이 나중에 전화를 트리거 할 수 있습니까?

import java.util.Locale; 
import javafx.application.Application; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.collections.FXCollections; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class CustomResizeExample extends Application { 

    @SuppressWarnings("unchecked") 
    private Parent getContent() { 
     TableView <Locale> table = new TableView <>(FXCollections.observableArrayList(Locale.getAvailableLocales())); 
     TableColumn <Locale, String> countryCode = new TableColumn <>("CountryCode"); 
     countryCode.setCellValueFactory(new PropertyValueFactory <>("country")); 
     TableColumn <Locale, String> language = new TableColumn <>("Language"); 
     language.setCellValueFactory(new PropertyValueFactory <>("language")); 
     table.getColumns().addAll(countryCode, language); 

     TableColumn <Locale, Locale> local = new TableColumn <>("Locale"); 
     local.setCellValueFactory(c -> new SimpleObjectProperty <>(c.getValue())); 

     table.getColumns().addAll(local); 
     table.setColumnResizePolicy(new CustomResizePolicy()); 

     BorderPane pane = new BorderPane(table); 
     return pane; 
    } 
    @Override 
    public void start (Stage stage) throws Exception { 
     stage.setScene(new Scene(getContent(), 800, 400)); 
     stage.show(); 
    } 

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

} 

@SuppressWarnings ("rawtypes") 
class CustomResizePolicy implements Callback <TableView.ResizeFeatures, Boolean> { 
    @Override 
    public Boolean call (TableView.ResizeFeatures feature) { 

     System.out.println ("Called"); //This does not print when the divider is double-clicked. 

     return TableView.CONSTRAINED_RESIZE_POLICY.call(feature); 
    } 
} 

답변

3

TableViewSkin에서 버그가 : 여기

CustomResizePolicy에 대한 호출에 포함되지 않는 더블 클릭을 보여주는 작업 예이다.

Java 8에서 열 구분 기호를 두 번 클릭하여 호출되는 resizeColumnToFitContent 메서드는 TableViewresizeColumn을 호출하지 않습니다. 결과적으로 레이아웃이 올바르게 업데이트되지 않습니다. 너비에 맞게 너비를 조정하면 크기를 조정할 수 있습니다. 실제로 fit-to-width 반복은 폭을 실제 너비에 가깝고 가깝게 설정합니다. 같은 열을 연속으로 여러 번 맞춰보고 크기를 조정하십시오 (다른 열을 사용하면이 동작이 재설정됩니다).

나는 좋은 해결 방법을 찾을 시간이 없었습니다. 개선의 일부 외관은 TableViewSkin 및 최우선 resizeColumnToFitContent을 하위 클래스있다 : 올바른 수정을 찾기 위해 좀 더 연구를 취할 것

class CustomTableSkin<T> extends TableViewSkin<T> { 

    public CustomTableSkin(TableView<T> tableView) { 
     super(tableView); 
     i = tableView.getColumns().size() + 1; 
    } 

    private int i; 

    @Override 
    protected void resizeColumnToFitContent(TableColumn<T, ?> tc, int maxRows) { 
     double before = tc.getWidth(); 
     super.resizeColumnToFitContent(tc, maxRows); 
     double now = tc.getWidth(); 
     double diff = before - now; 
     i--; 
     if (i >= 0) 
      resizeColumn(tc, -diff); 
    } 
} 

경우에 resizeColumn 도움에 대한 호출의 추가,하지만.

Java 9에서 스키닝 구현이 변경되었지만 문제가 여전히 존재한다고 생각합니다.

+1

Java 8에서 CustomTableSkin을 (를) 찾을 수 없습니다. 귀하의 게시물을 오해 했습니까? – JoshuaD

+0

@JoshuaD'CustomTableSkin'이 코드에 정의되어 있습니다. – user1803551

+1

Er. 내 Java - openjdk 버전 "1.8.0_151"에서 "TableViewSkin"을 찾을 수 없다는 뜻입니다. "com.sun.javafx.scene.control.TableViewSkin 가져 오기"를 시도 할 때 가져 오기를 확인할 수 없습니다. – JoshuaD