如何自动设置 table 中每一列 header 的 column-width
How to autoset column-width of each column header in a table
我想以编程方式自动设置 column-width,以便 table header 适合其内容。
@Override
public void initialize(URL url, ResourceBundle rb) {
TableColumn<String, String> col1 = new TableColumn<>("C1");
TableColumn<String, String> col2 = new TableColumn<>("Column 2");
TableColumn<String, String> col3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> col4 = new TableColumn<>("blablabla");
table.getColumns().add(col1);
table.getColumns().add(col2);
table.getColumns().add(col3);
table.getColumns().add(col4);
for(int i=0;i<4;i++) {
System.out.println("Column width >> "+table.getColumns().get(i).getPrefWidth());
}
}
table 中每个 header 的 column-width 始终设置为值 80
。如何获取和设置宽度值,以便 header 标题在每一列中可见 header?
您可以尝试:列调整策略:
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html#getColumnResizePolicy--
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
查看截图:
UNCONSTRAINED_RESIZE_POLICY
CONSTRAINED_RESIZE_POLICY
好的,我找到了一种根据内容调整 header-columns 大小的简单方法。
参考 FontMetrics 它计算文本宽度,然后您可以设置正确的宽度
package tabledemo;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.*;
import javafx.scene.control.*;
public class FXMLDocumentController implements Initializable {
@FXML private TableView<String> table;
@Override
public void initialize(URL url, ResourceBundle rb) {
TableColumn<String, String> column1 = new TableColumn<>("C1");
TableColumn<String, String> column2 = new TableColumn<>("Column 2");
TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> column4 = new TableColumn<>("blablabla");
table.getSelectionModel().getSelectedIndex();
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
table.getColumns().add(column4);
for(int i=0;i<4;i++) {
String text = table.getColumns().get(i).getText();
AffineTransform affinetransform = new AffineTransform();
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
Font font = new Font("Arial", Font.PLAIN, 12); //assuming 'Arial' is standard font in TableView
double textwidth = (double)(font.getStringBounds(text, frc).getWidth());
table.getColumns().get(i).setPrefWidth(textwidth+10);
}
}
}
您可以在此处使用 FontMetrics:
TableColumn<String, String> column1 = new TableColumn<>("C1");
TableColumn<String, String> column2 = new TableColumn<>("Column 2");
TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> column4 = new TableColumn<>("blablabla");
table.getSelectionModel().getSelectedIndex();
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
table.getColumns().add(column4);
FontMetrics fontMetrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(new Font("Arial", 12));
for (int i = 0; i < 4; i++) {
String text = table.getColumns().get(i).getText();
double textwidth = fontMetrics.computeStringWidth(text);
table.getColumns().get(i).setPrefWidth(textwidth + 10);
}
我再向您推荐的一点是,您需要先考虑header列的文本样式才能使用fontMetrics。
CSS 分析器或 senicView 将对检查 css 属性.
有很大帮助
我想以编程方式自动设置 column-width,以便 table header 适合其内容。
@Override
public void initialize(URL url, ResourceBundle rb) {
TableColumn<String, String> col1 = new TableColumn<>("C1");
TableColumn<String, String> col2 = new TableColumn<>("Column 2");
TableColumn<String, String> col3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> col4 = new TableColumn<>("blablabla");
table.getColumns().add(col1);
table.getColumns().add(col2);
table.getColumns().add(col3);
table.getColumns().add(col4);
for(int i=0;i<4;i++) {
System.out.println("Column width >> "+table.getColumns().get(i).getPrefWidth());
}
}
table 中每个 header 的 column-width 始终设置为值 80
。如何获取和设置宽度值,以便 header 标题在每一列中可见 header?
您可以尝试:列调整策略: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html#getColumnResizePolicy--
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
查看截图:
UNCONSTRAINED_RESIZE_POLICY
好的,我找到了一种根据内容调整 header-columns 大小的简单方法。 参考 FontMetrics 它计算文本宽度,然后您可以设置正确的宽度
package tabledemo;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.*;
import javafx.scene.control.*;
public class FXMLDocumentController implements Initializable {
@FXML private TableView<String> table;
@Override
public void initialize(URL url, ResourceBundle rb) {
TableColumn<String, String> column1 = new TableColumn<>("C1");
TableColumn<String, String> column2 = new TableColumn<>("Column 2");
TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> column4 = new TableColumn<>("blablabla");
table.getSelectionModel().getSelectedIndex();
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
table.getColumns().add(column4);
for(int i=0;i<4;i++) {
String text = table.getColumns().get(i).getText();
AffineTransform affinetransform = new AffineTransform();
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
Font font = new Font("Arial", Font.PLAIN, 12); //assuming 'Arial' is standard font in TableView
double textwidth = (double)(font.getStringBounds(text, frc).getWidth());
table.getColumns().get(i).setPrefWidth(textwidth+10);
}
}
}
您可以在此处使用 FontMetrics:
TableColumn<String, String> column1 = new TableColumn<>("C1");
TableColumn<String, String> column2 = new TableColumn<>("Column 2");
TableColumn<String, String> column3 = new TableColumn<>("Last Column (C3)");
TableColumn<String, String> column4 = new TableColumn<>("blablabla");
table.getSelectionModel().getSelectedIndex();
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
table.getColumns().add(column4);
FontMetrics fontMetrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(new Font("Arial", 12));
for (int i = 0; i < 4; i++) {
String text = table.getColumns().get(i).getText();
double textwidth = fontMetrics.computeStringWidth(text);
table.getColumns().get(i).setPrefWidth(textwidth + 10);
}
我再向您推荐的一点是,您需要先考虑header列的文本样式才能使用fontMetrics。
CSS 分析器或 senicView 将对检查 css 属性.
有很大帮助