如何创建带有行编号的 JFace TreeViewer

How to create a JFace TreeViewer with row numbering

我尝试为树中的每一行添加一个数字。 树和它的编号是有效的,但不是很好,所以有没有其他最好的方法来实现这个?因为如果树节点展开,我必须获取所有展开的树节点并增加其编号。我还使用了 TreeViewer 来创建树。

// base container
Composite composite = new Composite( (Composite) parent, SWT.NONE );
composite.setLayout( new GridLayout( 2, false ) );
composite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );

// The container for numbering in the tree
Composite numComposite = new Composite( composite, SWT.NONE );
numComposite.setLayout( new FillLayout( SWT.VERTICAL ) );
numComposite.setLayoutData( new GridData( GridData.VERTICAL_ALIGN_BEGINNING ) );

// the tree container
MyTree tree = new MyTree( composite );
tree.setContentProvider( new ContentProvider() );

Label test = new Label( numComposite, SWT.NONE );
test.setText( "1" );
test = new Label( numComposite, SWT.NONE );
test.setText( "2" );
test = new Label( numComposite, SWT.NONE );
test.setText( "3" );
test = new Label( numComposite, SWT.NONE );
test.setText( "4" );
test = new Label( numComposite, SWT.NONE );
test.setText( "5" );

我建议从一个高度与 Tree 小部件相同的自定义 Canvas 控件开始。

只要树的垂直滚动位置发生变化,Canvas 就需要重新绘制 (canvas.redraw())。要跟踪此类更改,需要添加多个侦听器

  • 滚动条上的选择监听器(tree.getVerticalBar().addSelectionListener()
  • 一个键侦听器 (tree.addKeyListener()),当 Up/Down[=55= 等导航键时更新 Canvas ], PgUp/PgDn,等按
  • 一个调整大小的侦听器 (tree.addControlListener()),它在调整树的大小时更新 Canvas 的大小和内容
  • ...可能还有一些...

自定义Canvas的paint listener可以绘制行号。第一行号可以从顶部索引 (tree.getTopIndex()) 派生。随后的行号将使用树的项目高度 (tree.getItemHeight()) 与行对齐。


我已经在此处上传了上述解决方案的草稿

https://gist.github.com/rherrmann/fc248fb01a00fb4fa73187cbbdaf441f

包含一个 main 方法,该方法使用小型 SWT 应用程序演示行号标尺。

首选宽度当前取自当前字体中字符串“9999”的宽度。但由于最大行号始终可以用 getVisibleItemCount() 计算,因此调整首选宽度应该不难,为当前显示的行号提供足够的空间。

棘手的部分可能是确定在首选宽度更改后何时重新布局 Tree 和 TreeRule 的父级。

这里和那里可能存在一些小问题需要解决,但总的来说,代码显示了这种方法的可行性。

getVisibleItemCount()中的代码是从SWT Snippet中复制过来的,然后进行了调整。