tableview 中的 javafx 列自动调整大小 [英] javafx column in tableview auto fit size

查看:37
本文介绍了tableview 中的 javafx 列自动调整大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

afaik javafx 中的 TableView 有 2 个列调整大小策略:CONSTRAINED_RESIZE_POLICY 和 UNCONSTRAINED_RESIZE_POLICY,但我希望调整列的大小以适应其单元格的内容我认为这是其他平台的一个简单问题(如C#中的datagridview)但无法解决

afaik The TableView in javafx have 2 column resize policies: CONSTRAINED_RESIZE_POLICY and UNCONSTRAINED_RESIZE_POLICY, but I want columns is resized to fit the content of theirs cells I think it's a simple problem in other platform (like datagridview in C#) but can not resolve

推荐答案

3 年后我再次回到这个问题,一些建议是计算每个单元格中数据的文本大小(它很复杂,取决于字体大小,字体家庭,填充...)

After 3 years I come back to this problem again, some suggestions are calculating the size of text of data in each cell (it's complicated depending on font size, font family, padding...)

但我意识到当我点击表格标题上的分隔线时,它会根据我的需要调整大小以适合内容.所以我深入研究JavaFX源代码我终于在TableViewSkin中找到了resizeColumnToFitContent方法,但它是protected方法,我们可以通过反射解决:>

But I realize that when I click on the divider on table header, it's resized fit to content as I want. So I dig into JavaFX source code I finally found resizeColumnToFitContent method in TableViewSkin, but it is protected method, we can resolve by reflection:

import com.sun.javafx.scene.control.skin.TableViewSkin;
import javafx.scene.control.Skin;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GUIUtils {
    private static Method columnToFitMethod;

    static {
        try {
            columnToFitMethod = TableViewSkin.class.getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class);
            columnToFitMethod.setAccessible(true);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void autoFitTable(TableView tableView) {
        tableView.getItems().addListener(new ListChangeListener<Object>() {
            @Override
            public void onChanged(Change<?> c) {
                for (Object column : tableView.getColumns()) {
                    try {
                        columnToFitMethod.invoke(tableView.getSkin(), column, -1);
                    } catch (IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

注意我们调用了tableView.getItems()",所以我们必须在setItems()

Note that we call "tableView.getItems()" so we have to call this function after setItems()

这篇关于tableview 中的 javafx 列自动调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆