使用 JavaFX -8 自动调整 TableView 中 TableColumn 的 TableColumn 的大小
automatically resize TableColumn of TableColumn in TableView with JavaFX -8
当我在 JavaFX 中生成 table 时,列太大,我想在它们出现在我的应用程序中时调整它们的大小以减少它们。
我在 Whosebug 上阅读了那些有用但对我没有帮助的文章:javafx column in tableview auto fit size ; JavaFX TableColumn resize to fit cell content。
确实,与主题不同,我的专栏中有专栏,但它不起作用。
有关信息,这些列的反应方式相同,如果我们双击它们,它们会自动调整大小。
我试图重现这些解决方案:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.util.List;
import java.util.stream.Collectors;
import com.sun.javafx.scene.control.skin.TableViewSkin;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
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 <S> void autoFitTable(TableView<S> tableView) {
tableView.getItems().addListener(new ListChangeListener<Object>() {
@Override
public void onChanged(Change<?> c) {
for (TableColumn column : tableView.getColumns()) {
try {
List<TableColumn<S, ?>> columns = (List<TableColumn<S, ?>>) column.getColumns.stream().collect(Collectors.toList());
for (TableColumn col : columns) {
columnToFitMethod.invoke(tableView.getSkin(), col, -1);
}
columnToFitMethod.invoke(tableView.getSkin(), column, -1);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
});
}
}
在我对子列的第二次迭代中,我有:
java.lang.reflect.InvocationTargetException at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498) at
myPackage.GUIUtils.onChanged(GUIUtils.java:37)
.
.
.
Caused by: java.lang.NullPointerException at
com.sun.javafx.scene.control.skin.TableViewSkin.resizeColumnToFitContent(TableViewSkin.java:257)
... 80 more
你知道我能做什么吗?
感谢您的帮助
对于那些感兴趣的人,我的解决方案有效,但我的某些专栏不可见,这就是我有例外的原因。
只需输入 if(col.isVisible()) 就可以了!
当我在 JavaFX 中生成 table 时,列太大,我想在它们出现在我的应用程序中时调整它们的大小以减少它们。 我在 Whosebug 上阅读了那些有用但对我没有帮助的文章:javafx column in tableview auto fit size ; JavaFX TableColumn resize to fit cell content。 确实,与主题不同,我的专栏中有专栏,但它不起作用。 有关信息,这些列的反应方式相同,如果我们双击它们,它们会自动调整大小。 我试图重现这些解决方案:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.util.List;
import java.util.stream.Collectors;
import com.sun.javafx.scene.control.skin.TableViewSkin;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
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 <S> void autoFitTable(TableView<S> tableView) {
tableView.getItems().addListener(new ListChangeListener<Object>() {
@Override
public void onChanged(Change<?> c) {
for (TableColumn column : tableView.getColumns()) {
try {
List<TableColumn<S, ?>> columns = (List<TableColumn<S, ?>>) column.getColumns.stream().collect(Collectors.toList());
for (TableColumn col : columns) {
columnToFitMethod.invoke(tableView.getSkin(), col, -1);
}
columnToFitMethod.invoke(tableView.getSkin(), column, -1);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
});
}
}
在我对子列的第二次迭代中,我有:
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at myPackage.GUIUtils.onChanged(GUIUtils.java:37) . . . Caused by: java.lang.NullPointerException at com.sun.javafx.scene.control.skin.TableViewSkin.resizeColumnToFitContent(TableViewSkin.java:257) ... 80 more
你知道我能做什么吗? 感谢您的帮助
对于那些感兴趣的人,我的解决方案有效,但我的某些专栏不可见,这就是我有例外的原因。 只需输入 if(col.isVisible()) 就可以了!