如何创建带有行编号的 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中复制过来的,然后进行了调整。
我尝试为树中的每一行添加一个数字。 树和它的编号是有效的,但不是很好,所以有没有其他最好的方法来实现这个?因为如果树节点展开,我必须获取所有展开的树节点并增加其编号。我还使用了 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中复制过来的,然后进行了调整。