我正在构建一个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;
}
任何方向都会非常有帮助。再次高兴地发布您认为可能有助于回答问题的任何代码。只需发表评论即可立即添加。
答案 0 :(得分:0)
我将添加里程碑,因为我发现这些里程碑,以防其他人,但现在这个问题得到了回答。
里程碑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()
方法并创建我自己的方法,这些方法在paint方法中被调用。有很多复制粘贴,所以我可以通常调用私有方法。我只是重命名它们并改为引用这些方法。 ui类的设计方式并没有使它变得非常灵活。下面是2个图像,我选择不同的级别,列在不同的级别显然是不同的宽度。
里程碑3
我能够通过跟踪模型中的视图来完成这项工作。这对我来说似乎很脏,因为模型应该与视图分开。由于树列的类是唯一的,所以如果该列是视图中的第一列,我只返回了正确的类。
我对这种技术的一个问题是,我得到的意外行为是返回的值不一致。我试图通过覆盖JTree.covertValueToText()
来解决这个问题。由于JTree只需要1个值,并且根据视图中的列顺序,该值可能会发生变化。因此,在重写此方法时,我会检查存储的索引以获取JTree列的值。这又会导致意外行为。如果我找到修复程序,我会更新帖子。