如何自动设置表中每个列标题的列宽

时间:2016-02-02 16:57:45

标签: javafx column-width

我想以编程方式自动设置列宽,以便表头符合其内容。

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

表中每个标题的列宽始终设置为80的值。如何获取和设置宽度值,以便标题标题在每个列标题中可见?

4 个答案:

答案 0 :(得分:1)

您可以在此处使用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);
    }

答案 1 :(得分:0)

您可以尝试:列调整大小政策: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html#getColumnResizePolicy--

        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

见截图:

UNCONSTRAINED_RESIZE_POLICY UNCONSTRAINED_RESIZE_POLICY CONSTRAINED_RESIZE_POLICY CONSTRAINED_RESIZE_POLICY

答案 2 :(得分:0)

好的,我发现了一种简单的方法,可以将标题列的大小调整为内容。 参考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);
        }            
    }     
}

Header-width fitted to its content

答案 3 :(得分:0)

我向您推荐的另一件事是您需要首先考虑列标题的文本样式以使用fontMetrics。

CSS分析器或senicView将对css属性的隐藏提供很大帮助。