【问题标题】:How Can I Maintain User-Specified Column Widths in a JTable?如何在 JTable 中维护用户指定的列宽?
【发布时间】:2012-04-17 14:45:55
【问题描述】:

所以我正在使用JTable,它与我自己的自定义数据模型相关联。这一切都是功能性的,但我遇到的问题是,任何时候我对表进行更改(触发 tableDataChanged、tableStructureChanged 等)所有列宽都会自行重置为默认值。我从研究中了解到,这与默认分配的TableColumnModel 有关。在此重置之外,我对 DefaultTableColumnModel 的功能感到满意,但如果用户应该调整列的大小(通过拖动列标题的边缘),我只想保留列的宽度。

我知道 TableColumns 的 setPreferredWidth(),并且我已经能够成功地做到这一点;我想我的问题是我应该听什么样的事件来保存和设置这个首选宽度。我尝试将PropertyChangeListener 添加到表头,但是每当我尝试调整大小时,我都会得到一个 StackOverflow(我假设它是递归运行的)。我完全可以在数据模型中为列宽添加一个额外的数据成员并将其存储在那里,但我只是不知道何时/如何设置这些宽度,以便它们不会被@987654326 覆盖@等事件。想法?

【问题讨论】:

  • 在关闭进程之前,读取列宽并将它们保存到属性文件中。当您打开您的进程时,请阅读属性文件,如果存在,请设置列宽。您可能需要扩展 DefaultTableColumnModel 以便控制列宽。
  • 它实际上在任何调用 fireTableStructureChanged() 时都会这样做,而不仅仅是在程序开始时,所以如果我在数据模型中添加或删除列(它必须重新生成列)它确实这个。我试过覆盖fireTableStructureChanged() 来手动设置列宽,但它似乎没有效果。我想我只是不确定这个列生成的确切位置以及覆盖它的位置。
  • 我一直在做数据驱动的列宽。如果我找到任何东西,我会提供答案。
  • 哦,好的,谢谢。是的,我是 JTables 的新手,所以我边走边学。

标签: java jtable


【解决方案1】:

怎么样

table.setAutoCreateColumnsFromModel(false);

我也遇到了这个问题,这对我有用!

【讨论】:

    【解决方案2】:

    试试这样的。

    import javax.swing.JTable;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;
    
    public class ColumnResizer {
    
        public static void setColumnPreferredWidth(JTable table, int column,
                int preferredWidth) {
            TableColumnModel columnModel = table.getColumnModel();
            TableColumn tableColumn = columnModel.getColumn(column);
            tableColumn.setPreferredWidth(preferredWidth);
        }
    
    }
    

    【讨论】:

    • 我喜欢这个想法,它确实有效,但只在下一次结构更改事件之前。不过,它让我走上了正轨,我现在意识到这一切都发生在TableColumnModeladdColumn() 方法中。我在这里找到了源:fuseyism.com/classpath/doc/javax/swing/table/…,并且我还在那里添加了一个column.setPreferredWidth()。我会将引用绑定到我的数据模型中,以便它可以根据需要获取和设置列宽,并在那里处理它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2019-10-14
    • 2015-09-06
    • 2013-02-16
    • 2013-06-19
    • 2018-03-09
    • 2013-11-27
    • 2014-08-28
    相关资源
    最近更新 更多