tableview中的javafx列自动调整大小 [英] javafx column in tableview auto fit size
问题描述
afaik javafx中的TableView有两个列调整大小策略: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 方法,但它是受保护的方法,我们可以通过反思来解决:
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屋!