(javafx)如何根据内容自动调整tableview列的宽度

(javafx)如何根据内容自动调整tableview列的宽度,javafx,Javafx,当我双击列标题单元格的右边框时,它会自动调整列的宽度。 如何以编程方式执行相同的操作?最终我找到了解决方案: TableViewSkin<?> skin = (TableViewSkin<?>) table.getSkin(); TableHeaderRow headerRow = skin.getTableHeaderRow(); NestedTableColumnHeader rootHeader = headerRow.getRootHead

当我双击列标题单元格的右边框时,它会自动调整列的宽度。
如何以编程方式执行相同的操作?

最终我找到了解决方案:

    TableViewSkin<?> skin = (TableViewSkin<?>) table.getSkin();
    TableHeaderRow headerRow = skin.getTableHeaderRow();
    NestedTableColumnHeader rootHeader = headerRow.getRootHeader();
    for (TableColumnHeader columnHeader : rootHeader.getColumnHeaders()) {
        try {
            TableColumn<?, ?> column = (TableColumn<?, ?>) columnHeader.getTableColumn();
            if (column != null) {
                Method method = skin.getClass().getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class);
                method.setAccessible(true);
                method.invoke(skin, column, 30);
            }
        } catch (Throwable e) {
            e = e.getCause();
            e.printStackTrace(System.err);
        }
    }
TableViewSkin皮肤=(TableViewSkin)table.getSkin();
TableHeaderRow headerRow=skin.getTableHeaderRow();
NestedTableColumnHeader rootHeader=headerRow.getRootHeader();
对于(TableColumnHeader columnHeader:rootHeader.getColumnHeaders()){
试一试{
TableColumn列=(TableColumn)columnHeader.getTableColumn();
if(列!=null){
方法Method=skin.getClass().getDeclaredMethod(“ResizeColumntOffitContent”,TableColumn.class,int.class);
方法setAccessible(true);
调用(皮肤,列,30);
}
}捕获(可丢弃的e){
e=e.getCause();
e、 printStackTrace(System.err);
}
}

Javafx仍然很粗糙。许多简单的事情都需要通过deep-ass来完成。

使用上述由Аааааааааааааааааа1072

import com.sun.javafx.scene.control.skin.NestedTableColumnHeader;
导入com.sun.javafx.scene.control.skin.TableColumnHeader;
导入com.sun.javafx.scene.control.skin.TableHeaderRow;
导入com.sun.javafx.scene.control.skin.TableViewSkin;
导入javafx.application.Platform;
导入javafx.collections.ObservableList;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入java.lang.reflect.Method;
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
公共类TableViewPlus扩展了TableView
{
私有布尔值flSkinPropertyListenerAdded=false;
// ---------------------------------------------------------------------------------------------------------------------
公共表ViewPlus()
{
超级();
此参数为.setEditable(false);
}
// ---------------------------------------------------------------------------------------------------------------------
public TableViewPlus(最终可观察列表项)
{
超级(toItems);
此参数为.setEditable(false);
}
// ---------------------------------------------------------------------------------------------------------------------
public void resizeColumnsToFit()的大小
{
if(this.getSkin()!=null)
{
this.resizeColumnsPlatformCheck();
}
否则如果(!this.flSkinPropertyListenerAdded)
{
this.flSkinPropertyListenerAdded=true;
//从https://stackoverflow.com/questions/38718926/how-to-get-tableheaderrow-from-tableview-nowadays-in-javafx
//添加侦听器以检测皮肤何时已初始化,因此.getSkin()!=null。
this.skinProperty().addListener((a、b、newSkin)->this.resizeColumnsPlatformCheck());
}
}
// ---------------------------------------------------------------------------------------------------------------------
私有void resizeColumnsPlatformCheck()的大小
{
if(Platform.isFxApplicationThread())
{
this.resizealColumnSusingReflection();
}
其他的
{
runLater(this::resizeAllColumnsUsingReflection);
}
}
// ---------------------------------------------------------------------------------------------------------------------
//从https://stackoverflow.com/questions/38090353/javafx-how-automatically-width-of-tableview-column-depending-on-the-content
//天哪。
私有void resizealColumnSusingReflection()
{
final TableViewSkin loSkin=(TableViewSkin)this.getSkin();
//只有在渲染后才会应用蒙皮。这在“关于”对话框中发生。
if(loSkin==null)
{
System.err.println(“皮肤为空”);
返回;
}
final TableHeaderRow loHeaderRow=loSkin.getTableHeaderRow();
最终NestedTableColumnHeader loRootHeader=loHeaderRow.getRootHeader();
对于(最终表格ColumnHeader loColumnHeader:loRootHeader.getColumnHeaders())
{
尝试
{
final TableColumn loColumn=(TableColumn)loColumnHeader.getTableColumn();
if(loColumn!=null)
{
最终方法loMethod=loSkin.getClass().getDeclaredMethod(“ResizeColumntOffitContent”,TableColumn.class,int.class);
loMethod.setAccessible(true);
loMethod.invoke(loSkin,loColumn,30);
}
}
捕获(最终可丢弃loErr)
{
printStackTrace(System.err);
}
}
}
// ---------------------------------------------------------------------------------------------------------------------
}
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
table.skinProperty().addListener((a、b、newSkin)->{
TableViewSkin皮肤=(TableViewSkin)table.getSkin();
TableHeaderRow headerRow=skin.getTableHeaderRow();
NestedTableColumnHeader rootHeader=headerRow.getRootHeader();
对于(TableColumnHeader columnHeader:rootHeader.getColumnHeaders()){
试一试{
TableColumn列=(TableColumn)columnHeader.getTableColumn();
if(列!=null){
方法Method=skin.getClass().getDeclaredMethod(“ResizeColumntOffitConte
import com.sun.javafx.scene.control.skin.NestedTableColumnHeader;
import com.sun.javafx.scene.control.skin.TableColumnHeader;
import com.sun.javafx.scene.control.skin.TableHeaderRow;
import com.sun.javafx.scene.control.skin.TableViewSkin;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;

import java.lang.reflect.Method;

// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
public class TableViewPlus extends TableView
{
  private boolean flSkinPropertyListenerAdded = false;

  // ---------------------------------------------------------------------------------------------------------------------
  public TableViewPlus()
  {
    super();

    this.setEditable(false);
  }

  // ---------------------------------------------------------------------------------------------------------------------
  public TableViewPlus(final ObservableList toItems)
  {
    super(toItems);

    this.setEditable(false);
  }

  // ---------------------------------------------------------------------------------------------------------------------
  public void resizeColumnsToFit()
  {
    if (this.getSkin() != null)
    {
      this.resizeColumnsPlatformCheck();
    }
    else if (!this.flSkinPropertyListenerAdded)
    {
      this.flSkinPropertyListenerAdded = true;

      // From https://stackoverflow.com/questions/38718926/how-to-get-tableheaderrow-from-tableview-nowadays-in-javafx
      // Add listener to detect when the skin has been initialized and therefore this.getSkin() != null.
      this.skinProperty().addListener((a, b, newSkin) -> this.resizeColumnsPlatformCheck());
    }

  }

  // ---------------------------------------------------------------------------------------------------------------------
  private void resizeColumnsPlatformCheck()
  {
    if (Platform.isFxApplicationThread())
    {
      this.resizeAllColumnsUsingReflection();
    }
    else
    {
      Platform.runLater(this::resizeAllColumnsUsingReflection);
    }
  }

  // ---------------------------------------------------------------------------------------------------------------------
  // From https://stackoverflow.com/questions/38090353/javafx-how-automatically-width-of-tableview-column-depending-on-the-content
  // Geesh. . . .
  private void resizeAllColumnsUsingReflection()
  {
    final TableViewSkin<?> loSkin = (TableViewSkin<?>) this.getSkin();
    // The skin is not applied till after being rendered. Which is happening with the About dialog.
    if (loSkin == null)
    {
      System.err.println("Skin is null");
      return;
    }

    final TableHeaderRow loHeaderRow = loSkin.getTableHeaderRow();
    final NestedTableColumnHeader loRootHeader = loHeaderRow.getRootHeader();
    for (final TableColumnHeader loColumnHeader : loRootHeader.getColumnHeaders())
    {
      try
      {
        final TableColumn<?, ?> loColumn = (TableColumn<?, ?>) loColumnHeader.getTableColumn();
        if (loColumn != null)
        {
          final Method loMethod = loSkin.getClass().getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class);
          loMethod.setAccessible(true);
          loMethod.invoke(loSkin, loColumn, 30);
        }
      }
      catch (final Throwable loErr)
      {
        loErr.printStackTrace(System.err);
      }
    }

  }

  // ---------------------------------------------------------------------------------------------------------------------
}
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------------------------------
    table.skinProperty().addListener((a, b, newSkin) -> {
        TableViewSkin<?> skin = (TableViewSkin<?>) table.getSkin();
        TableHeaderRow headerRow = skin.getTableHeaderRow();
        NestedTableColumnHeader rootHeader = headerRow.getRootHeader();
        for (TableColumnHeader columnHeader : rootHeader.getColumnHeaders()) {
            try {
                TableColumn<?, ?> column = (TableColumn<?, ?>) columnHeader.getTableColumn();
                if (column != null) {
                    Method method = skin.getClass().getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class);
                    method.setAccessible(true);
                    method.invoke(skin, column, 30);
                }
            } catch (Throwable e) {
                e = e.getCause();
                e.printStackTrace(System.err);
            }
        }

    });
/**
 * Resizes all visible columns to fit its content. Note that this does nothing if a column's 
 * prefWidth is != 80.
 * 
 * @param table
 */
public static void doAutoSize(TableView<?> table) {
    // good enough to find an arbitrary column header
    // due to sub-optimal api
    TableColumnHeader header = (TableColumnHeader) table.lookup(".column-header");
    if (header != null) {
        table.getVisibleLeafColumns().stream().forEach(column -> doColumnAutoSize(header, column));
    }
}

public static void doColumnAutoSize(TableColumnHeader columnHeader, TableColumn column) {
    // use your preferred reflection utility method 
    FXUtils.invokeGetMethodValue(TableColumnHeader.class, columnHeader, "doColumnAutoSize", 
            new Class[] {TableColumnBase.class, Integer.TYPE}, 
            new Object[] {column, -1});
}