SWT part 3 —— Event(事件)

本文介绍了SWT(Simple Widget Toolkit)中的事件处理机制,包括如何为控件添加监听器,事件触发时监听器如何工作。文章详细列出了SWT中的各种事件类型,包括高层事件和底层事件,并解释了它们的应用场景。

        创建了一个display对象和一些用户界面部件,启动应用程序的消息循环,当有事件发生时,应用程序从消息队列中读取到事件并分发给部件。这就是SWT程序的运行机制。大部分应用程序的逻辑都是在处理用户事件。

 

        基本的模式是为小部件加上监听器(listener),当对应的事件被触发时,监听器就会被执行,下面是一个简单的列子:

   Display display = new Display ();
   Shell shell = new Shell (display);
   Label label = new Label (shell, SWT.CENTER);
   ...
   shell.addControlListener (new ControlAdapter () {
      public void controlResized (ControlEvent e) {
         label.setBounds (shell.getClientArea ());
      }
   });

        对于每一种监听器(listener),对应一个定义监听器的接口(XyzListener),一个提供事件信息的类(XyzEvent),和一个添加监听器的API方法(addXyzListener),如果监听器定义了多于一个的方法,会有一个实现了监听器接口的适配器(XyzAdapter),适配器提供了空方法。所有的这些事件(events)、监听器(listeners)和适配器(adapters)都定义在包org.eclipse.swt.events 中。

 

         事件可以分为两类,一类是高层事件,表示发生在控件上的逻辑操作,一类是底层事件,描述更为具体的用户交互动作,高层的事件可能是由多个平台相异的事件表示的,一般情况下,底层事件应该仅用于自定制的用户界面部件的实现中。

 

        下面列出了SWT中的事件类型:

High level Events:

Activate, Deactivate

Generated when a Control is activated or deactivated.

控件被激活或失去激活状态时产生的事件

Arm

A MenuItem is armed (highlighted and ready to be selected).

菜单项获得焦点时触发的事件

Close

A Shell is about to close as requested by the window manager.

关闭shell窗口触发的事件

DefaultSelection

The user selects an item by invoking a default selection action. For example, by hitting Enter or double clicking on a row in a Table.

当用户执行一个默认的选择动作是触发的事件,例如按下回车键或双击表格中的一行。

Dispose

A widget is about to be disposed, either programmatically or by user.

程序或者用户销毁小部件时触发的事件

DragDetect

The user has initiated a possible drag operation.

当用户做拖动操作触发的事件

EraseItem

A TableItem or TreeItem is about to have its background drawn.

绘制表格的行或这树的节点的背景时触发的事件

Expand, Collapse

An item in a Tree is expanded or collapsed.

展开或销毁树的节点时触发的事件

Help

The user has requested help for a widget. For example, this occurs when the F1 key is pressed under Windows.

用户请求帮助时触发的事件,例如在Windows系统中按下F1键。

Iconify, Deiconify

A Shell has been minimized, maximized, or restored.

最小化、最大化、恢复 shell窗口时触发的事件

ImeComposition

Allows custom text editors to implement in-line editing of international text.

允许定制文本编辑器实现行内编辑多国文本内容。

MeasureItem

The size of a custom drawn TableItem or TreeItem is being requested.

获取自定制的表格的行或树的节点的尺寸时触发的事件

MenuDetect

The user has requested a context menu.

用户请求上下文菜单时触发

Modify

The widget's text has been modified.

修改文本内容时触发

Move, Resize

A control has changed position or has been resized, either programmatically or by user.

通过程序或者用户直接移动控件位置,或改变控件大小时触发的事件,

Movement

An updated caret offset is needed in response to a user action in a StyledText.

指针偏移时触发

OpenDocument

The operating system has requested that a document be opened.

操作系统请求打开文档时触发

OrientationChange

The orientation of a Text control is changing.

文本控件改变方向时触发

PaintItem

A TableItem or TreeItem is about to have its foreground drawn.

改变表格的行或树的节点前景时触发

Selection

The user selects an item in the control. For example, by single clicking on a row in a Table or by keyboard navigating through the items.

用户选择控件的一个项时触发,例如点击表格中的一行,或者用键盘的方向键选择UI项时

SetData

Data needs to be set on a TableItem when using a virtual table.

为控件设置数据时触发

Settings

An operating system property, such as a system font or color, has been changed.

操作系统属性,例如系统字体和颜色,发生变化是触发

Show, Hide

A control's visibility has changed.

控件显示状态发生变化时触发

Traverse

The user is trying to traverse out of the control using a keystroke. For example, the escape or tab keys are used for traversal.

使用escape键改变状态时 或 使用tab键使得控件焦点发生变化时触发的事件

Verify

A widget's text is about to be modified. This event gives the application a chance to alter the text or prevent the modification.

当修改文本框的内容时,这个事件使得应用程序有机会能够修改文本内容或阻止内容的修改。

 

Low level events:

FocusIn, FocusOut

A control has gained or lost focus.

控件获得或失去焦点时触发的事件

KeyDown, KeyUp

The user has pressed or released a keyboard key when the control has keyboard focus.

控件拥有键盘焦点,同时用户按下或释放键盘键时触发的事件

MouseDown, MouseUp, MouseDoubleClick

The user has pressed, released, or double clicked the mouse over the control.

用户在控件上按下、释放或双击鼠标时触发的事件

MouseMove

The user has moved the mouse above the control.

用户在控件上移动鼠标时触发的事件

MouseEnter, MouseExit, MouseHover

The mouse has entered, exited, or hovered over the control.

鼠标进入、离开或悬浮在控件上时触发的事件

MouseHorizontalWheel, MouseVerticalWheel, MouseWheel

The mouse wheel has been rotated.

鼠标滚轮滚动时触发的控件

Paint

The control has been damaged and requires repainting.

控件重绘时触发的事件

 

附:

参考:http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/swt_widgets_events.htm

 

 

<think>我们正在讨论JavaSWT中的Part标题点击事件处理。根据用户的问题,用户想要在点击Part的标题时触发特定事件。在SWT中,Part通常指的是在Eclipse RCP应用程序中的一个视图(View)或编辑器(Editor)。但是,SWT本身并没有一个名为"Part"的控件,而是Eclipse RCP中的概念。在SWT中,我们通常处理的是控件(Control)的事件。对于视图(View)的标题栏,我们可以通过获取视图的标题区域(通常是标题栏)并添加监听器来实现。在EclipseRCP中,视图的标题栏可以通过`ViewPart`的`createPartControl`方法中创建的`Composite`来定制。但是,直接获取标题栏控件并添加监听器需要一些技巧。一种常见的方法是:1.获取视图的标题区域控件(通常是一个`Composite`)。2.为该控件添加鼠标监听器(`MouseListener`)或鼠标事件监听器(`MouseAdapter`)。但是,请注意,Eclipse RCP的视图标题栏可能包含多个子控件(例如,标题文本、工具栏按钮等),所以我们需要确保我们添加监听器的控件是整个标题栏。在Eclipse3.x和4.x中,视图的标题栏可以通过`ViewPart`的`getViewSite().getActionBars().getToolBarManager()`等获取,但这不是直接获取标题栏控件。实际上,我们可以通过以下步骤获取标题栏控件:在`createPartControl`方法中,我们可以通过`getViewSite().getShell()`获取Shell,但这并不是标题栏。另一种方法是使用`getViewSite().getPane()`,但这个方法并不常用。实际上,更直接的方法是使用`org.eclipse.ui.internal`包中的类,但这并不推荐,因为internal包可能不稳定。因此,我们可以尝试另一种思路:在创建视图的内容时,我们可以自己创建一个标题栏,然后在这个标题栏上添加监听器。这样我们就可以完全控制标题栏的创建和事件处理。但是,如果我们不想自定义整个标题栏,而是想使用默认的标题栏并添加事件监听,我们可以尝试以下方法:在Eclipse RCP中,视图的标题栏控件可以通过以下方式获取:视图的标题栏实际上是一个`org.eclipse.swt.widgets.ToolBar`,它位于视图的`TitleArea`中。我们可以通过反射或者使用`org.eclipse.ui.internal`包中的类来获取,但这样会破坏API的稳定性。因此,推荐的做法是使用Eclipse提供的扩展点或者API来添加事件监听,但遗憾的是,标准的视图标题栏点击事件并没有直接暴露的API。另一种替代方案:我们可以为整个视图的控件添加一个焦点监听器,当视图获得焦点时(这通常发生在用户点击标题栏时)触发事件。但是,这并不精确,因为用户也可能点击内容区域。考虑到用户的需求是点击标题时触发,我们可以尝试以下方法:1.在`createPartControl`方法中,我们可以获取视图的父容器(即视图的ContentComposite),然后获取它的父容器,直到找到标题栏所在的容器。这需要了解EclipseRCP的视图布局结构,但不同版本的Eclipse可能布局不同。2.使用`org.eclipse.ui.internal.PartPane`,通过`getViewSite().getPane()`获取,然后调用`getControl()`方法。但是,`PartPane`是internal包中的类。由于直接操作内部类不稳定,我们可能需要重新考虑:是否可以通过自定义视图的标题栏来实现?自定义视图标题栏的方法:在EclipseRCP中,我们可以通过设置视图的`ViewPart`的`setTitleToolBar`和`setTitle`等方法来设置标题,但并没有直接提供点击事件。因此,我们可以选择不使用默认的标题栏,而是自己创建一个标题栏控件(例如,一个`Composite`),并在其中放置一个标签(`Label`)或按钮(`Button`),然后在这个控件上添加监听器。示例步骤:1.在`createPartControl`方法中,创建一个`Composite`作为标题栏,并设置布局。2.在标题栏`Composite`中创建需要的控件(如标签、按钮等)。3.为这个标题栏控件添加鼠标监听器。4.在标题栏下方创建视图的内容区域。这样,我们就可以完全控制标题栏的点击事件。以下是一个简单的示例代码: ```javapublic classMyViewextends ViewPart {privateComposite parentComposite;@Overridepublicvoid createPartControl(Compositeparent){//创建一个垂直布局的Composite作为整个视图的容器parentComposite= newComposite(parent, SWT.NONE);parentComposite.setLayout(newGridLayout(1, false));//创建标题栏CompositetitleComposite= newComposite(parentComposite,SWT.BORDER);titleComposite.setLayoutData(newGridData(SWT.FILL, SWT.TOP,true,false));titleComposite.setLayout(newGridLayout(1, false));//在标题栏中添加一个标签(也可以添加其他控件)Label titleLabel =new Label(titleComposite, SWT.NONE);titleLabel.setText("MyView Title");titleLabel.setLayoutData(newGridData(SWT.FILL, SWT.CENTER,true,true));//为标题栏添加鼠标点击事件titleComposite.addMouseListener(newMouseAdapter() {@Overridepublicvoid mouseDown(MouseEvente){//处理标题栏点击事件System.out.println("Title clicked!");}});//创建内容区域Composite contentComposite =new Composite(parentComposite, SWT.NONE);contentComposite.setLayoutData(new GridData(SWT.FILL,SWT.FILL, true, true));// ...在内容区域添加其他控件}@Overridepublicvoid setFocus(){parentComposite.setFocus();} }```在这个例子中,我们创建了一个自定义的标题栏(titleComposite),并为其添加了鼠标点击事件。当用户点击标题栏时,会触发事件。注意:这种方法会替换掉默认的标题栏,因此我们需要自己设计标题栏的外观(包括标题文本、图标等)。如果用户希望保留Eclipse默认的标题栏样式,那么可能需要更复杂的处理,比如通过CSS样式来模仿默认样式,或者使用Eclipse Forms提供的标题栏。但是,考虑到EclipseRCP的默认视图标题栏并不是一个公开的控件,自定义标题栏可能是更可行的方法。另外,对于编辑器(Editor)的标题,同样可以通过类似的方式,在`EditorPart`的`createPartControl`方法中自定义标题栏。总结:在Java SWT中,如果要在点击Part(视图或编辑器)的标题时触发事件,推荐的做法是自定义标题栏控件,并在该控件上添加鼠标事件监听器。相关问题:1.如何在Eclipse RCP中自定义视图的标题栏?2.如何为SWT控件添加鼠标事件监听器?3.在Eclipse RCP中,如何获取默认视图的标题栏控件?4.如何模仿Eclipse默认视图标题栏的样式?5.如何处理编辑器(Editor)的标题点击事件?</think>### Java SWT Part 标题点击事件处理 在 Java SWT 中处理 Part(视图/编辑器)标题的点击事件,需要通过自定义标题栏控件并添加监听器实现。以下是具体步骤和代码示例: #### 实现原理 1. **标题栏自定义** SWT 的 `Part` 标题栏默认不暴露点击事件接口,需创建自定义标题栏控件(如 `Composite` + `Label`)。 2. **事件监听** 为标题栏控件添加 `MouseListener` 捕获点击事件3. **焦点控制** 通过 `setFocus()` 确保点击时 Part 被激活。 #### 完整代码示例 ```java import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.part.ViewPart; public class CustomView extends ViewPart { private Composite titleComposite; // 自定义标题栏 @Override public void createPartControl(Composite parent) { // 创建自定义标题栏 titleComposite = new Composite(parent, SWT.BORDER); titleComposite.setLayout(new FillLayout()); Label titleLabel = new Label(titleComposite, SWT.CENTER); titleLabel.setText("点击我触发事件"); // 添加标题点击监听器 titleComposite.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { handleTitleClick(); // 触发自定义事件 } }); // 创建内容区域 Composite content = new Composite(parent, SWT.NONE); content.setLayout(new FillLayout()); new Label(content, SWT.NONE).setText("视图内容区域"); } private void handleTitleClick() { // 自定义事件处理逻辑 System.out.println("标题被点击!"); MessageBox dialog = new MessageBox(titleComposite.getShell(), SWT.ICON_INFORMATION); dialog.setText("事件触发"); dialog.setMessage("Part标题点击事件已处理!"); dialog.open(); } @Override public void setFocus() { titleComposite.setFocus(); // 确保标题可获焦 } } ``` #### 关键点说明 1. **标题栏控件** 使用 `Composite` + `Label` 模拟标题栏,通过 `SWT.BORDER` 增强视觉区分度。 2. **事件绑定** `addMouseListener` 捕获标题栏的鼠标点击事件,`mouseDown` 是最可靠的触发点。 3. **焦点管理** `setFocus()` 方法中指定 `titleComposite.setFocus()` 确保标题栏可接收事件。 4. **扩展性** 可在 `handleTitleClick()` 中添加业务逻辑,如刷新视图、弹出菜单等。 #### 实际应用场景 - 点击标题栏折叠/展开视图内容 - 实现标题栏右键上下文菜单 - 动态更新 Part 状态指示器(如未读通知) - 双击标题栏最大化视图 > **注意**:若需获取系统默认标题栏(不推荐,因 Eclipase 内部 API 不稳定),可尝试反射访问 `org.eclipse.ui.internal.PartPane`,但自定义方案更安全可靠[^1][^3]。 --- ### 相关问题 1. 如何在 SWT 中实现双击标题栏最大化视图? 2. SWT 标题栏右键菜单的最佳实现方式是什么? 3. 如何动态更新 SWT Part 标题的文本和图标? 4. 在自定义标题栏中添加按钮控件有哪些注意事项? 5. SWT 与 JFace 在 Part 事件处理上有何区别? [^1]: Eclipse SWT 官方文档建议避免使用内部 API,自定义控件是更稳定的解决方案。 [^3]: ActiveX 控件集成虽强大,但标题栏处理仍需依赖基础 SWT 事件机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值