我正在构建一个JTreeTable。我找到了一些初学者代码,并且取得了很大进展。最后,我的目标是能够在不同的层次上拥有不同的数据,比如分层列表。
目前,我让它处理不同级别的数据。然而,当涉及到改变列作为下一个目标时,我却碰壁了。从我目前的情况来看,我还有3个里程碑:
我正在接近结束这项任务,但再次停留在这3中的第一。
由于创建JTreeTable很复杂,所以最小示例利用了图像中列出的几个类:

我很高兴将代码发布到这些类中的任何一个,但我也不想用无用的代码来阻塞这个问题。首先,让我展示我想要的功能。
第一图像是当最高层被选择时,第二图像是当第二层被选择时。注意这些列是如何不同的。这就是我想在我的申请中发生的事情。
顶级选择:

二级选择:

因此,我试图解决这个问题的一种方法是,在代码的这一部分中更改列表选择:
ListSelectionListener listener = (ListSelectionEvent e) -> {
TreeTableModelAdapter adapter = (TreeTableModelAdapter) JTreeTable.this.getModel();
//Need to see why this breaks.
JTreeTable.this.getTableHeader().setColumnModel(adapter.getColumnModel());
};
this.getSelectionModel().addListSelectionListener(listener);此代码处于JTreeTable的初始化阶段。我也尝试过在TableHeader和表上设置列模型。下面是当我选择一行时发生的情况:

柱子就消失在我身上。列模型的创建使用以下方法在TreeTableModelAdapter类中进行:
public TableColumnModel getColumnModel(){
DefaultTableColumnModel model = new DefaultTableColumnModel();
for(int i=0;i<getColumnCount();i++){
TableColumn column = new TableColumn();
column.setIdentifier(getColumnName(i));
model.addColumn(column);
}
return model;
}任何方向都会很有帮助。再次高兴地发布任何您认为可能有助于回答问题的代码。只要在里面放一个评论,我马上就把它加进去。
发布于 2017-05-28 16:35:33
我会添加里程碑,因为我发现他们的情况下,这有助于其他人,但就目前来说,这个问题得到了答案。
里程碑1
我实际上解决了第一个里程碑。关键是触发创建列模型的列,而不是创建新的列模型。下面是更改行选择时的代码:
//Change columns depending on row
ListSelectionListener listener = (ListSelectionEvent e) -> {
createDefaultColumnsFromModel();
};
this.getSelectionModel().addListSelectionListener(listener);此代码根据在JTree部分JTreeTable中选择的行创建列。TreeTableModelAdapter实现了getColumnCount()和getColumnName()方法,方法是将JTree中选定的行传递给JTreeTableModel,以便根据JTree中的特定节点动态检索列及其名称。对我来说,关键是触发那些再次被调用以更新JTreeTable的那些。
里程碑2
事实证明,根据数据级别调整列宽比我原先预期的要困难得多。为了保留单元格状态,当列模型改变时,我不得不断开单元格的绘制。这是一个多毛的进程,因为这是在BasicTableUI中完成的,获取单元格矩形的方法是私有的。因此,我不得不对它进行子类化,重载paint()方法,并创建自己的方法,这些方法将在that方法中被调用。这里有大量的复制粘贴,这样我就可以调用正常的私有方法。我只是重命名了它们并引用了这些方法。ui类的设计方式并没有使它变得非常灵活。下面是2张图片,我选择了不同的级别,列在不同的级别上有明显的不同宽度。


里程碑3
我能够通过跟踪模型中的视图来完成这项工作。这在我看来是很脏的,因为模型应该与视图分开。由于树列的类是唯一的,所以如果该列是视图中的第一个列,则返回正确的类。
这个技术的一个问题是,在返回的值不一致的情况下,我会得到意想不到的行为。我试图通过重写JTree.covertValueToText()来解决这个问题。因为一个JTree只需要一个值,并且取决于视图中列的顺序,这个值可能会改变。因此,在重写此方法时,我检查JTree列的值的存储索引。同样,这会导致意外行为。如果我找到补丁,我会更新这篇文章。
https://stackoverflow.com/questions/44228706
复制相似问题