我尝试为树中的每一行添加一个数字。 树和它的编号工作但不是很好,那么有没有其他最好的方法来实现它?因为如果树节点扩展了,我必须获得所有扩展树节点并增加其编号。我还使用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" );
答案 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复制然后调整的。