今天写了一个Jface的dialog,作为配置界面,其中有个配置项特别长,于是想到了ScrollComposite滚动面板来显示。我的做法是在把这个配置项放在一个Composite中,然后使用scrollComposite.setContent(Composite)来加入滚动面板。目的是出现一个滚动面板显示配置项。
但是,问题出现了,滚动条始终没有出现,于是加了一些配置:
- Composite composite = new Composite(parent, SWT.NONE);
- ScrolledComposite panel = new ScrolledComposite(composite, SWT.BORDER | SWT.V_SCROLL);
- panel.setLayoutData(new GridData(GridData.FILL_VERTICAL));
- //强制显示滚动条
- panel.setAlwaysShowScrollBars(true );
- panel.setExpandHorizontal(true );
- panel.setExpandVertical(true );
- // 拖动滚动条里可以看到的Composite的最大高度
- panel.setMinHeight(200 );
- panel.setLayout(new GridLayout( 1 , false ));
- Composite subPanel = new Composite(taskPanel, SWT.BORDER);
- subPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
- subPanel.setLayout(new GridLayout( 1 , false ));
- panel.setContent(subPanel);
但是还是不行,原以为增加了
- panel.setExpandHorizontal( true );
- panel.setExpandVertical(true );
- panel.setMinHeight(200 );
以后会显示滚动条。但是结果却是滚动条出现了,但是滚动按钮却没有出现,而且滚动面板和里面Composite一样高,scrollComposite似乎一点作用也没有。
查了好几个小时一直找不到原因,最后看到了一封mail上面的原文是这么写的:
they will take as much room as they need.
意思就是你要限制父亲面板的大小,否则滚动面板会跟着里面的Composite一起涨。受到这句话的启发,我尝试设置父容器的大小:
- composite.setSize( 500 , 300 );
无果,于是我又试设置JFace Dialog的Shell大小:
- protected Control createDialogArea(Composite parent){
- Shell shell = getShell();
- // 设置对话框大小
- shell.setSize(500 , 300 );
- ...
结果更糟糕了,什么也显示不出来了。最后,看了JFace Dialog源代码以后才发现,需要重载下面这个函数:
- protected Point getInitialSize() {
- Point result = super .getInitialSize();
- ...
Dialog中的源代码通过调用super.getInitialSize()来动态计算Dialog中的各个SWT组件占用的宽度和高度,然后将Dialog的shell设置成这些宽高的总和;于是,我重载了这个函数,让它返回一个固定的宽高:
- /**
- * 重载Dialog.getInitialSize方法设置对话框大小
- */
- protected Point getInitialSize() {
- return new Point( 500 , 300 );
- }
这样,滚动面板终于不和里面的Composite一起长了。但是,滚动按钮还是没有,怎么回事呢,原来是
- taskPanel.setMinHeight( 200 );
的值太小了,设成800就可以了。
好了,问题圆满解决,主要原因是JFace Dialog自动计算宽高的缘故,我把整理过的代码贴出来:
- protected Control createDialogArea(Composite parent){
- ...
- Composite composite = new Composite(parent, SWT.NONE);
- ScrolledComposite panel = new ScrolledComposite(composite, SWT.BORDER | SWT.V_SCROLL);
- panel.setLayoutData(new GridData(GridData.FILL_VERTICAL));
- //强制显示滚动条
- panel.setAlwaysShowScrollBars(true );
- panel.setExpandHorizontal(true );
- panel.setExpandVertical(true );
- // 拖动滚动条里可以看到的Composite的最大高度
- panel.setMinHeight(800 );
- panel.setLayout(new GridLayout( 1 , false ));
- Composite subPanel = new Composite(panel, SWT.BORDER);
- subPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
- subPanel.setLayout(new GridLayout( 1 , false ));
- panel.setContent(subPanel);
- ...
- }
- /**
- * 重载Dialog.getInitialSize方法设置对话框大小
- */
- protected Point getInitialSize() {
- return new Point( 500 , 300 );
- }
希望大家少走弯路!