Java JTable 无法设置列宽

标签 java swing jtable width jtableheader

我尝试设置列的宽度,但它根本不起作用,我一直在寻找答案几个小时,这是我的代码,任何人都可以告诉我问题是什么。提前致谢。

    String [] columns = {"Day","StratTime","EndTime","Description"};
    mtbl = new DefaultTableModel();

    tbl = new JTable(mtbl);
    jsPane = new JScrollPane(tbl);

    tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


    for (int i = 0; i < Timedcolumns.length; i++) {
        mtbl.addColumn(columns[i]);
        tbl.getColumnModel().getColumn(i).setPreferredWidth(100);
    }

最佳答案

由于 addColumn()JTable 最终可能会重建所有列。以下是 JTable.tableChanged() 的片段:

public void tableChanged(TableModelEvent e) {
    if (e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW) {
        ...

        if (getAutoCreateColumnsFromModel()) {
    // This will effect invalidation of the JTable and JTableHeader.
            createDefaultColumnsFromModel();
    return;
    }
        ...

TableModelEvent.HEADER_ROW 由于 DefaultTableModel 执行 addColumn() 而被触发。 addColumn 执行 fireTableStructureChanged:

public void fireTableStructureChanged() {
    fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
} 

您最终只能在添加的最后一列上设置首选大小,因为其余列是由 createDefaultColumnsFromModel() 重新创建的。

总而言之,在单独的循环中创建所有列后,设置首选大小可能会更简单。

关于Java JTable 无法设置列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12558291/

相关文章:

java - 将数据附加到 JTextArea 以进行运行模拟

java - 为什么 AUTO_RESIZE_LAST_COLUMN 的作用与 AUTO_RESIZE_ALL_COLUMNS 类似?

java - 在jtable中添加列后添加数据

java - 有人可以解释一下 struts2 XSL ResultType 是如何工作的吗?

java - 使用键盘 ("AWT-EventQueue-0")

java - 排除 pojo 响应中的空字段

java - 无法显示选项卡式 JTable 的表头

java - 如何更改 JTable 中第一个单元格的背景颜色?

java - 使用 Java 接口(interface)作为参数强制执行严格(更好)类型安全的想法

java - 如何以左右水平可导航样式显示小图片图标库,就像在 JavaScript/JQuery 中一样