`

解决JFace Dialog中ScrollComposite无法滚动

阅读更多

今天写了一个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上面的原文是这么写的:

写道
you must constrain your composites (both parent and scrolled) otherwise
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);
}

 希望大家少走弯路!

分享到:
评论
1 楼 leilove321 2010-03-25  
非常感谢 这个问题困扰好久了

相关推荐

    eclipse4 开发SWT/JFace demo

    eclipe 4以上的插件就支持CSS主题切换的功能 plugin.xml 中扩展点org.eclipse.core.runtime.products、org.eclipse.e4.ui.css.swt.theme

    Eclipse SWT/JFace 书中 全部实例

    Eclipse SWT(Standard Widget Toolkit)和JFace是用于构建Java GUI应用程序的强大工具,它们与Eclipse IDE紧密集成,提供了一套丰富的控件和抽象层,使得开发者能够创建出功能丰富的桌面应用。本压缩包包含的"全部...

    swt/jface api帮助文档

    7. **JFace服务**:包括Dialog、WorkbenchWindow、Action、SelectionService等,它们简化了窗口、动作和选择事件的管理。 8. **数据绑定**:JFace的数据绑定框架允许数据模型与用户界面元素之间的双向同步,使得...

    SWT/JFace从入门到精通

    JFace的主要组件包括视图(View)、编辑器(Editor)、对话框(Dialog)以及数据绑定机制。 3. Eclipse IDE与SWT/JFace Eclipse作为一款强大的集成开发环境(IDE),其用户界面大量使用了SWT和JFace。这使得...

    swt/jface.jar

    标题中的"swt/jface.jar"是一个关键组件,它在Java开发环境中用于构建用户界面。SWT(Standard Widget Toolkit)是IBM开发的一个开源GUI库,它提供了与原生操作系统更紧密集成的图形用户界面控件。JFace是建立在SWT...

    JFace-TableTree的若干问题.doc

    在Java编程环境中,JFace库是Eclipse RCP(Rich Client Platform)的一部分,它提供了一套高级用户界面组件,如TableViewer和TreeViewer,用于构建桌面应用程序。在文档标题和描述中提到的问题主要涉及到JFace中的...

    org.eclipse.jface.rar

    "org.eclipse.jface.rar" 是一个压缩包文件,包含的是Eclipse IDE中JFace库的源代码。Eclipse JFace 是一个...同时,对源代码的深入理解也有助于开发者解决在使用JFace过程中遇到的问题,进行更高效的调试和性能优化。

    SWT JFACE in Action(中文)

    SWT(Standard Widget Toolkit)和JFace是Java编程中用于构建图形用户界面(GUI)的两个关键库,尤其在Eclipse开发环境中广泛应用。本篇文章将深入探讨SWT和JFace的相关知识点,帮助读者理解这两个库的功能、优势...

    SWT + JFace 入门

    SWT (Standard Widget Toolkit) 和 JFace 是两个用于构建Java图形用户界面(GUI)的开源库,它们在Java开发中特别是在开发桌面应用时扮演着重要角色。本文将深入探讨这两个库,以及如何入门使用它们。 SWT是IBM开发...

    SWT/JFACE客户端登录窗口例子

    5. **对话框(Dialog)**:登录窗口可能是一个独立的 `Dialog` 对象,它继承自 `org.eclipse.jface.dialogs.Dialog` 类。对话框提供了一种方便的方式,让用户在主应用程序窗口之外输入信息,且可以自定义其大小、...

    Swt JFace in Action 中文版

    JFace提供了一些高级组件,如视图(View)、编辑器(Editor)、对话框(Dialog)和表单(Form)等,并且包含数据绑定框架,使得模型与视图的分离变得更加简单。JFace还引入了模型-视图-控制器(MVC)设计模式,有助...

    JFace的源码,从官网下的

    JFace是Eclipse框架中的一个重要组成部分,主要用于提供面向用户的界面组件和数据抽象,使得开发者能够构建更加简洁、可维护的图形用户界面(GUI)。JFace的源码分析可以帮助我们深入理解其内部工作原理,提高开发...

    SWT_JFace_in_action_jface_action_

    《SWT_JFace_in_Action》是一本专注于Java编程领域中SWT(Standard Widget Toolkit)和JFace技术的实践指南。这本书深入浅出地讲解了如何使用这两项强大的工具来构建功能丰富的图形用户界面(GUI)。SWT是Eclipse...

    SWT/JFace官方实例

    SWT (Standard Widget Toolkit) 和 JFace 是 Eclipse 开发平台中的两个重要组件,主要用于构建图形用户界面(GUI)。它们是 Java 语言中的 GUI 工具包,为开发者提供了丰富的控件和高级界面功能。 SWT 是一个直接与...

    JFace教程

    在实际开发中,JFace 被广泛应用于构建各种桌面应用,特别是那些具有复杂数据处理需求的应用程序。例如,Eclipse IDE 自身就大量使用了 JFace 和 SWT 技术来构建其强大的功能界面。 #### 二、JFace的核心特性 1. *...

    jface源代码不容错过

    JFace是Eclipse框架中的一个重要组成部分,它提供了一组高级的用户界面组件和工具,用于简化Java应用程序的开发。在Eclipse这样的IDE中,JFace起到了桥梁的作用,连接了SWT(Standard Widget Toolkit)和更高级别的...

    swt jface_API_CHM.zip

    4. **Dialogs**: JFace扩展了SWT的对话框,提供了一些预定义的对话框,如SelectionDialog、InputDialog等,同时提供了构建自定义对话框的工具。 5. **Table and Tree Viewer**: JFace的TableViewer和TreeViewer是对...

    JFace 类包(3.14)

    在JFace 3.14这个版本中,我们主要会讨论以下几个核心概念和组件: 1. **Viewer框架**:JFace 的 Viewer 框架是其设计的核心部分,它提供了一种用于展示数据的统一方法。Viewer可以看作是一个可定制的数据视图,...

    SWT/JFACE API

    SWT (Standard Widget Toolkit) 和 JFace 是两个用于构建Java图形用户界面(GUI)的开源库,它们在Java开发领域中被广泛使用,特别是在Eclipse IDE及其插件开发中。SWT是底层的UI库,提供了与操作系统原生控件直接...

    mysource-jface

    这篇博客文章可能详细介绍了如何在实际开发中应用JFace,并且可能包含了一些示例代码来帮助读者理解其工作原理。 在Java编程中,JFace的作用是作为SWT的抽象层,使得开发者可以更加专注于业务逻辑,而不是底层的GUI...

Global site tag (gtag.js) - Google Analytics