JAVAFX-14 RESIZECOLUMNTOFITCONTENT方法

 2023-02-16    309  

问题描述

javafx-14将此方法放入tablecolumnheader,而不是在皮肤中.如何从tablecolumn和tableview中找到tablecolumnheader?

推荐答案

不知道您是否仍然需要这个,但是如果其他人感兴趣,这就是我基于David Goodenough的Scala代码在Java中超越问题的方式.

JAVAFX-14 RESIZECOLUMNTOFITCONTENT方法

桌子的类

import javafx.scene.control.TableColumnBase;
import javafx.scene.control.TableView;
import javafx.scene.control.skin.NestedTableColumnHeader;
import javafx.scene.control.skin.TableColumnHeader;
import javafx.scene.control.skin.TableHeaderRow;
import javafx.scene.control.skin.TableViewSkin;

import java.util.ArrayList;
import java.util.List;

public class CustomTableViewSkin extends TableViewSkin<Track> {
    private List<CustomTableColumnHeader> columnHeadersList = new ArrayList<>();

    private class CustomTableColumnHeader extends TableColumnHeader {
        /**
         * Creates a new TableColumnHeader instance to visually represent the given
         * {@link TableColumnBase} instance.
         *
         * @param tc The table column to be visually represented by this instance.
         */
        public CustomTableColumnHeader(TableColumnBase tc) {
            super(tc);
        }

        public void resizeColumnToFitContent() {
            super.resizeColumnToFitContent(-1);
        }
    }

    public CustomTableViewSkin(TableView<Track> tableView) {
        super(tableView);
    }

    @Override
    protected TableHeaderRow createTableHeaderRow() {
        return new TableHeaderRow(this) {
            @Override
            protected NestedTableColumnHeader createRootHeader() {
                return new NestedTableColumnHeader(null) {
                    @Override
                    protected TableColumnHeader createTableColumnHeader(TableColumnBase col) {
                        CustomTableColumnHeader columnHeader = new CustomTableColumnHeader(col);

                        if (columnHeadersList == null) {
                            columnHeadersList = new ArrayList<>();
                        }

                        columnHeadersList.add(columnHeader);

                        return columnHeader;
                    }
                };
            }
        };
    }

    public void resizeColumnToFit() {
        if (!columnHeadersList.isEmpty()) {
            for (CustomTableColumnHeader columnHeader : columnHeadersList) {
                columnHeader.resizeColumnToFitContent();
            }
        }
    }
}

和tableview的类

import javafx.scene.control.TableView;

public class CustomTableView extends TableView<Foo> {
    private final CustomTableViewSkin thisSkin;

    public CustomTableView() {
        super();

        setSkin(thisSkin = new CustomTableViewSkin(this));
    }

    public void resizeColumnsToFitContent() {
        if (thisSkin != null && getSkin() == thisSkin) {
            thisSkin.resizeColumnToFit();
        }
    }
}

其他推荐答案

好吧,此代码不是scala,而不是java,而是记录下面的代码可行: –

skin = new TableViewSkin(this) {
    override protected def createTableHeaderRow:TableHeaderRow = {
        new TableHeaderRow(this) {
            override protected def createRootHeader:NestedTableColumnHeader = {
                new NestedTableColumnHeader(null) {
                    override protected def createTableColumnHeader(col:TableColumnBase[_,_]) = {
                        val tableColumnHeader = new MyTableColumnHeader(col)
                        if(col == null || col.getColumns.isEmpty || col == getTableColumn) tableColumnHeader else new NestedTableColumnHeader(col)
                        }
                    }
                }
            }
        }
    } 
private class MyTableColumnHeader(tc:TableColumnBase[_,_]) extends TableColumnHeader(tc) {
    def resizeCol():Double = {
        resizeColumnToFitContent(-1)
        width.value
        }
    }

然后,当我想使用它时,我使用kleopatra的建议和: –

val w = columns.map { col =>
            // To find the TableColumnHeader we can use column.getStyleableNode as suggested by kleopatra on StackOverflow:-
            // you get the header from coumn.getStyleableNode (took a moment, had to check if it's really implemented) – kleopatra Jul 1 at 20:46
            col.getStyleableNode() match {
                case mtch:MyTableColumnHeader => mtch.resizeCol
                case _ => col.width.get
                }
    }.sum

其他推荐答案

这是 hack’ish 获取TableColumnHeader的方法:

public TableColumnHeader getTableColumnHeader(TableView<?> table, int index) {
    return (TableColumnHeader) table.queryAccessibleAttribute(AccessibleAttribute.COLUMN_AT_INDEX, index);
}

or,如 @kleopatra 建议您使用 non-hack’ish 方法可以做:

public TableColumnHeader getTableColumnHeader(TableView<?> table, int index) {
    return (TableColumnHeader) table.getColumns().get(index).getStyleableNode();
}

确保TableView是场景图的一部分.

但是,resizeColumnToFitContent方法受到保护,您将无法访问它.

以上所述是小编给大家介绍的JAVAFX-14 RESIZECOLUMNTOFITCONTENT方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33849.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。