解决JFace Dialog中ScrollComposite没法滚动

解决JFace Dialog中ScrollComposite无法滚动

今天写了一个Jface的dialog,作为配置界面,其中有个配置项特别长,于是想到了ScrollComposite滚动面板来显示。我的做法是在把这个配置项放在一个Composite中,然后使用scrollComposite.setContent(Composite)来加入滚动面板。目的是出现一个滚动面板显示配置项。

 

但是,问题出现了,滚动条始终没有出现,于是加了一些配置:

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. Composite composite =  new  Composite(parent, SWT.NONE);  
  2. ScrolledComposite panel = new  ScrolledComposite(composite, SWT.BORDER | SWT.V_SCROLL);  
  3. panel.setLayoutData(new  GridData(GridData.FILL_VERTICAL));  
  4. //强制显示滚动条   
  5. panel.setAlwaysShowScrollBars(true );  
  6. panel.setExpandHorizontal(true );  
  7. panel.setExpandVertical(true );  
  8. // 拖动滚动条里可以看到的Composite的最大高度   
  9. panel.setMinHeight(200 );  
  10.   
  11. panel.setLayout(new  GridLayout( 1 false ));  
  12.   
  13. Composite subPanel = new  Composite(taskPanel, SWT.BORDER);  
  14. subPanel.setLayoutData(new  GridData(GridData.FILL_BOTH));  
  15. subPanel.setLayout(new  GridLayout( 1 false ));  
  16. panel.setContent(subPanel);  

 

但是还是不行,原以为增加了

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. panel.setExpandHorizontal( true );  
  2. panel.setExpandVertical(true );  
  3. panel.setMinHeight(200 );  

以后会显示滚动条。但是结果却是滚动条出现了,但是滚动按钮却没有出现,而且滚动面板和里面Composite一样高,scrollComposite似乎一点作用也没有。

 

查了好几个小时一直找不到原因,最后看到了一封mail上面的原文是这么写的:

写道
you must constrain your composites (both parent and scrolled) otherwise
they will take as much room as they need.

 

意思就是你要限制父亲面板的大小,否则滚动面板会跟着里面的Composite一起涨。受到这句话的启发,我尝试设置父容器的大小:

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. composite.setSize( 500 300 );  

 

无果,于是我又试设置JFace Dialog的Shell大小:

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. protected  Control createDialogArea(Composite parent){  
  2.         Shell shell = getShell();  
  3.         // 设置对话框大小   
  4.         shell.setSize(500 300 );  
  5. ...  

 

结果更糟糕了,什么也显示不出来了。最后,看了JFace Dialog源代码以后才发现,需要重载下面这个函数:

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. protected  Point getInitialSize() {  
  2.         Point result = super .getInitialSize();  
  3.           
  4.         ...  

 

Dialog中的源代码通过调用super.getInitialSize()来动态计算Dialog中的各个SWT组件占用的宽度和高度,然后将Dialog的shell设置成这些宽高的总和;于是,我重载了这个函数,让它返回一个固定的宽高:

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. /**  
  2. * 重载Dialog.getInitialSize方法设置对话框大小  
  3. */   
  4. protected  Point getInitialSize() {  
  5.     return   new  Point( 500 300 );  
  6. }  

 

这样,滚动面板终于不和里面的Composite一起长了。但是,滚动按钮还是没有,怎么回事呢,原来是

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. taskPanel.setMinHeight( 200 );  

 

的值太小了,设成800就可以了。

 

好了,问题圆满解决,主要原因是JFace Dialog自动计算宽高的缘故,我把整理过的代码贴出来:

 

Java代码  解决JFace Dialog中ScrollComposite没法滚动
  1. protected  Control createDialogArea(Composite parent){  
  2.     ...  
  3.     Composite composite = new  Composite(parent, SWT.NONE);  
  4.     ScrolledComposite panel = new  ScrolledComposite(composite, SWT.BORDER | SWT.V_SCROLL);  
  5.     panel.setLayoutData(new  GridData(GridData.FILL_VERTICAL));  
  6.     //强制显示滚动条   
  7.     panel.setAlwaysShowScrollBars(true );  
  8.     panel.setExpandHorizontal(true );  
  9.     panel.setExpandVertical(true );  
  10.     // 拖动滚动条里可以看到的Composite的最大高度   
  11.     panel.setMinHeight(800 );  
  12.       
  13.     panel.setLayout(new  GridLayout( 1 false ));  
  14.       
  15.     Composite subPanel = new  Composite(panel, SWT.BORDER);  
  16.     subPanel.setLayoutData(new  GridData(GridData.FILL_BOTH));  
  17.     subPanel.setLayout(new  GridLayout( 1 false ));  
  18.     panel.setContent(subPanel);  
  19. ...  
  20. }  
  21.   
  22. /**  
  23. * 重载Dialog.getInitialSize方法设置对话框大小  
  24. */   
  25. protected  Point getInitialSize() {  
  26.     return   new  Point( 500 300 );  
  27. }  

 希望大家少走弯路!