【问题标题】:JTable update columns header height after multiple header insertion插入多个标题后JTable更新列标题高度
【发布时间】:2013-09-19 23:44:35
【问题描述】:

当我向表中添加新列但其标题标签的行数(使用htmlbr 元素)比已经存在的标题中时应该调用/触发什么,因此标题会相应地调整大小?

添加前

添加后

如果第一次绘制表格时列已经有该行数(标签为<html>Card<br>name</html>),则不会发生这种情况。

添加新记录时,我在TableModel 中触发fireTableStructureChanged()(因此添加了新列)。

【问题讨论】:

  • 小提示 fireTableStructureChanged() 重置所有自定义渲染器/编辑器,因为对于此作业,重置(全部为默认)是指定此方法
  • 抱歉,我无法完全理解您的建议。尤其是第二个帖子。 fireTableStructureChanged() 是否应该重置标题的渲染器?
  • @mKorbel:使用您的示例,我没有看到任何渲染器问题;由于模型拥有列名,我可以看到其他问题的可能性取决于TableModel 的选择。
  • 我没有时间好吧,如果你找不到时间让我们轻松回答,你可能会发现我们没有抽出时间尝试解决您的问题。

标签: java swing jtable tablecellrenderer preferredsize


【解决方案1】:

从@mKorbel 的example 开始,以下按钮会改变外观,如图所示。 DefaultTableModel 的方法setColumnIdentifiers() 代表您调用fireTableStructureChanged()。如果您扩展 AbstractTableModel,您应该在您的 TableModel 中执行此操作。

代码:

private DefaultTableModel model = new DefaultTableModel(data, columnNames) {…}
…
frame.add(new JToggleButton(new AbstractAction("Toggle") {
    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton b = (JToggleButton) e.getSource();
        if (b.isSelected()) {
            columnNames[0] = "<html>String<br>of pearls</html>";
        } else {
            columnNames[0] = "String";
        }
        model.setColumnIdentifiers(columnNames);
    }
}), BorderLayout.SOUTH);

【讨论】:

  • 问题是fireTableStructureChanged() 是否强制更新标头。如果是,那么我会在我的实现中调用它并且不需要任何其他调用。我发现的问题似乎与JScrollPane 的列标题的高度有关——我提供了我自己的实现,并覆盖了getPreferredSize() 来控制高度,现在它可以工作了。另一个问题是,为什么在表头高度更改后它没有自行更新? (我不会在这里发布代码,因为它真的很破碎和模块化,而且很难以简洁的方式放入)。
  • 是的,fireTableStructureChanged() 应该更新标题。 DefaultTableModelsetColumnIdentifiers() 中为您调用fireTableStructureChanged()JTable 实现了 Scrollable,因此如果需要,请覆盖 getPreferredScrollableViewportSize()
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2016-06-12
  • 2017-12-08
相关资源
最近更新 更多