gpt4 book ai didi

java - 双击列标题的分隔符时不会触发 CustomResizePolicy

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:45 25 4
gpt4 key购买 nike

我为 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。结果是布局没有正确更新。您尝试调整适合宽度的列的大小来观察这一点就足够了。事实上,反复进行 fitting-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 更改了皮肤实现,但我相信问题仍然存在。

关于java - 双击列标题的分隔符时不会触发 CustomResizePolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com