(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});
}