微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JTable TableColumn - 拖动列时 modelIndex 的属性没有变化

如何解决JTable TableColumn - 拖动列时 modelIndex 的属性没有变化

我需要检测用户何时对 JTable 的列重新排序,以便保留和恢复该信息。根据 JavaDocs,将 propertychangelistener 添加到表列应该就足够了,例如

    JTable t = ...;
    TableColumn keysColumn   = t.getColumnModel().getColumn(0);
    TableColumn valuesColumn = t.getColumnModel().getColumn(1);
    keysColumn.addPropertychangelistener(new Propertychangelistener {
      public void propertyChange(PropertyChangeEvent e) {
        System.out.println("PROPERTY: " + e.getPropertyName());
      }
    });

然而,虽然我收到 widthpreferredWidth 的更新,但重新排列列并不会触发任何可观察到的内容。我期待看到 modelIndex 的更新。做错了什么?

Linux 上的 OpenJDK 11,尝试了不同的外观。

解决方法

所以 modelIndexTableColumn 永远不会改变,因此没有属性改变。要观察运动,必须监听 TableColumnModelcolumnMoved 并过滤 e.getFromIndex != e.getToIndex 是视图索引,然后将它们映射回模型索引。 “如此简单”:-/

在 Scala 中

val tcm = t.getColumnModel

tcm.addColumnModelListener(new TableColumnModelListener {
  private def mkMap() = Seq.tabulate(t.getColumnCount)(t.convertColumnIndexToModel)

  private var viewToModel = mkMap()

  override def columnMoved(e: TableColumnModelEvent): Unit = {
    val viewFrom  = e.getFromIndex
    val viewTo    = e.getToIndex
    if (viewFrom != viewTo) {
      val modelFrom = viewToModel(viewFrom)
      val modelTo   = viewToModel(viewTo  )
      println(s"columnMoved: drag column $modelFrom from pos $viewFrom to $viewTo")
      viewToModel = mkMap()
      assert (viewToModel(viewTo) == modelFrom)
    }
  }

  override def columnAdded            (e: TableColumnModelEvent ): Unit = ()
  override def columnRemoved          (e: TableColumnModelEvent ): Unit = ()
  override def columnMarginChanged    (e: ChangeEvent           ): Unit = ()
  override def columnSelectionChanged (e: ListSelectionEvent    ): Unit = ()
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。