首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Eclipse 中的布局、属性和首选项(1)

Eclipse 中的布局、属性和首选项(1)

Eclipse 最令人感兴趣的方面之一是,通过将同一类中最佳的插件组合起来,您就有可能(并且方便地)定制自己的工作环境。例如,在 XM 和 XML 编辑器之间存在明显的相互协作(请参阅 中的“Black Sun”站点)。而且,正如本专栏文章所展示的,如果目前不支持您所选的工具,则可以不费力地添加一个插件来支持该工具。      
用户界面考虑事项用户界面始终是插件要考虑的问题。毕竟,插件旨在提供比 XM 长期以来所具有的原始命令行界面更为图形化的界面。
我之所以选择使用 Eclipse 是因为它在用户界面上具备的优势。Eclipse 有它自己的 GUI库 —         标准窗口小部件库(standard widget library,SWT)— 它提供了一种本机的 Swing 替代。我广泛地使用过基于 Swing 的产品,总是发现它们不如本机应用程序。不知何故,就是觉得本机控件的Swing 仿真不是很好。SWT 使用平台的控件,结果要好得多。      
不过,令人吃惊的是,在插件中几乎没有代码来管理用户界面。插件大多注册不可见的服务,譬如在上一篇专栏文章“使用 Eclipse 和 XM 构建项目”(请参阅 以获取这篇文章的链接)中所讨论的构建器。这篇专栏文章将讨论一些首选项和属性,这使我有机会来研究 SWT。      
我鼓励您下载这个项目的代码(请参阅 ),并在您阅读本文时查看它。      
SWT 布局SWT 具有您期望从现代库中获得的所有控件,譬如输入域、列表和按钮。但它也有树、工具栏、表以及其它控件。只要可能,SWT 就使用本机控件,所以最后的结果是,Java 应用程序和本机应用程序实际上没有区别。
AWT、Swing 和 SWT 具有许多相似之处。它们的库的主要区别在于其实现(Java 平台与本机平台)和命名约定。对于SWT,控件是        窗口小部件。窗口小部件类似于 JDK中的组件。在屏幕上,窗口小部件被安排在        组合(composite)(面板和窗口等)中。SWT 组合类似于 JDK 中的容器。      
在本专栏文章中,我不想把过多时间花在 SWT 的一些细节之上。只要说窗口小部件在         org.eclipse.swt.widgets 包中就足够了。其中的类名是自解释的,所以您浏览该文档应该没有问题。      
相反,我将把注意力放在布局上,它不同于 AWT 和 Swing 中的布局。清单 1 摘自         XMProjectPropertiesPage 类。我将在 中详细讨论该类,但现在让我们把注意力放在         buildGUI() 方法上。      
清单 1. buildGUI() 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
private Control buildUI(Composite parent)
{
   Composite composite = new Composite(parent,SWT.NULL);
   RowLayout rowLayout = new RowLayout();
   rowLayout.type = SWT.VERTICAL;
   rowLayout.wrap = false;
   composite.setLayout(rowLayout);
   hasNature = new Button(composite,SWT.CHECK);
   hasNature.setText(Resources.getString("eclipse.hasnature"));
   hasNature.addSelectionListener(new SelectionListener()
   {
      public void widgetDefaultSelected(SelectionEvent e)
      {
         group.setEnabled(hasNature.getSelection());
      }
         
      public void widgetSelected(SelectionEvent e)
      {
         group.setEnabled(hasNature.getSelection());
      }
   });
   group = new Group(composite,SWT.NONE);
   group.setText(Resources.getString("eclipse.properties"));
   GridLayout gridLayout = new GridLayout();
   gridLayout.numColumns = 2;
   group.setLayout(gridLayout);
   Label label = new Label(group,SWT.RIGHT);
   label.setText(Resources.getString("eclipse.src"));
   srcText = new Text(group,SWT.SINGLE);
   GridData gridData = new GridData();
   gridData.widthHint = 150;
   srcText.setLayoutData(gridData);
   label = new Label(group,SWT.RIGHT);
   label.setText(Resources.getString("eclipse.rules"));
   rulesText = new Text(group,SWT.LEFT);
   gridData = new GridData();
   gridData.horizontalAlignment = GridData.FILL;
   gridData.grabExcessHorizontalSpace = true;
   rulesText.setLayoutData(gridData);
   label = new Label(group,SWT.RIGHT);
   label.setText(Resources.getString("eclipse.publish"));
   publishText = new Text(group,SWT.LEFT);
   gridData = new GridData();
   publishText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
                                          | GridData.GRAB_HORIZONTAL));
   isBuild = new Button(group,SWT.CHECK);
   isBuild.setText(Resources.getString("eclipse.build"));
   gridData = new GridData();
   gridData.horizontalSpan = 2;
   isBuild.setLayoutData(gridData);
   return composite;
}




类似于 AWT 和 Swing,SWT 使用        布局来控制组合中窗口小部件的大小和位置。SWT布局几乎与 JDK 布局一样,但它们使用不同的类 — 同样,概念类似,但实现不同。      
SWT 在         org.eclipse.swt.layout 包中提出了四种布局:      
  • FillLayout :以竖直列或水平行方式呈现窗口小部件。它类似于 JDK 中的           BoxLayout 。
  • RowLayout :以一行或多行来呈现窗口小部件。更确切地讲,它可使窗口小部件在行尾换行。           RowLayout 类似于 JDK 中的           FlowLayout 。
  • GridLayout :功能更强大的布局。它类似于 JDK 中的           GridBagLayout 。           GridLayout 以网格方式来呈现窗口小部件,并提供了许多选项来控制间距、边界和对齐等因素。窗口小部件可以跨网格中的几个单元。
  • FormLayout :SWT 独有的布局(至少我不知道 JDK 有等同的布局方式)。           FormLayout 是一个特殊的网格,它将数据输入域及其标签组合在一起。
使用         RowLayout 和         GridLayout 。图 1 显示了清单 1 所创建的表单。它包含一个复选框和一个由四个其它窗口小部件所组成的组。         RowLayout 将复选框和组对齐。这里不能选择用         FillLayout ,因为复选框和组的大小不一样(         FillLayout 要求其中所有的窗口小部件的大小都一样)。      
图 1. 由清单 1 创建的表单初始化         RowLayout 与设置         RowLayout 的几个属性一样容易:         type 用于在竖直列方向和水平行方向进行切换,而         wrap 控制布局是否能创建多个行。然后,用         setLayout() 方法将该布局分配给组合。      
组(group)是在窗口小部件周围绘制一个边框的组合。在  中,组使用了         GridLayout 类。为了初始化         GridLayout ,您只要设置列数。注意:         GridBagLayout 通过常量(如         REMAINDER 和         RELATIVE )间接地指定行数。      
要分别指定每个单元的属性,         GridLayout 使用了         GridData 类。         GridData 类似于 JDK 中的         GridBagConstraints ,但属性名称不同。注意 SWT 和 JDK 之间的主要差别:使用SWT,您可以在窗口小部件上设置         GridData (用         setLayoutData() 方法),而不是在布局上设置。      
展示了 SWT 与 JDK 之间的另一个区别:组合没有容器中的         add() 方法。相反,窗口小部件可以在其构造函数中引用它们的父代。      
虽然这两个 API 存在不同,但如果您已经使用过 AWT 或 Swing,那么学习 SWT 对您来说很容易。
首选项和属性首选项和属性是紧密相关的。这两者都控制环境中的配置和选项。首选项用于配置选项,而配置选项应用于每个项目中的环境。一个典型示例是用颜色来突出显示编辑器中的语法。
用 Eclipse 的术语来讲,属性附属于资源(请参阅 以获取“Creating a project”的链接,这篇文章讨论了 Eclipse 资源)。例如,属性可以控制如何构建一个给定的项目。      
XM 插件将需要首选项和属性。我们的项目已经使用属性来设置源、发布和规则目录,以及控制是构建项目还是制作项目。这些属性源自老的命令行界面。在“Creating a project”中,我介绍了一个向导,由它来初始化属性,但到目前为止,还没有一个关于界面的小窍门来修改这些属性。
自从我开始使用项目性质(nature)(请参阅 以获取以前文章的链接)以来,我一直在搜索一种选项来将 XM 性质分配给任何项目。最终,我得出结论,性质可以被视为特殊的属性。      
至于首选项,控制台需要一个机制来过滤消息。当处理大项目时,重新构建会生成众多消息。由于难以区分错误和进展消息,因此我想给用户一个选项来控制显示哪些消息。
返回列表