如何使用行编号创建JFace TreeViewer

时间:2016-10-20 01:35:09

标签: java eclipse-plugin swt jface

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

enter image description here

// 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" );

1 个答案:

答案 0 :(得分:5)

我建议首先使用与Canvas小部件具有相同高度的自定义Tree控件。

每当更改树的垂直滚动位置时,都需要重新绘制画布(canvas.redraw())。要跟踪此类更改,需要添加几个侦听器

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

自定义Canvas的绘图侦听器可以绘制行号。第一行编号可以从顶部索引(tree.getTopIndex())派生。后续行号将使用树的项高度(tree.getItemHeight())将自己与行对齐。

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

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

包含一个main方法,用于演示带有小型SWT应用程序的行号标尺。

首选宽度目前来自字符串的宽度&#34; 9999&#34;在当前字体中。但由于最大行数始终可以使用getVisibleItemCount()计算,因此不应调整首选宽度,以便为当前显示的行号提供足够的空间。

棘手的部分可能是确定在首选宽度改变后重新布局Tree和TreeRule的父节点。

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

getVisibleItemCount()中的代码是从SWT Snippet复制然后调整的。