双击列标题的分隔符时不触发自定义调整大小策略



我编写了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 );
    }
}

这是TableViewSkin中的错误。

在Java 8中,通过双击列分隔符调用的方法resizeColumnToFitContent不会在TableView中调用resizeColumn。结果是布局未正确更新。您尝试调整适合宽度的列以观察这一点已经足够了。实际上,反复拟合宽度将使宽度越来越接近其真正的宽度。尝试安装,然后连续进行几次大小相同的列(使用其他列进行此操作将重置该行为)。

我没有时间找到一个好的解决方法。通过子类别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改变了皮肤的实现,尽管我相信这个问题仍然存在。

最新更新