原本以为CTabFolder中的元素默认支持可拖拉事件,无奈发现需要自己实现。实现如下代码:
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
final CTabFolder tabFolder = new CTabFolder(shell, SWT.CLOSE | SWT.BORDER | SWT.FLAT);
tabFolder.setSimple(false);
tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
for (int i = 0; i < 5; i++) {
CTabItem item = new CTabItem(tabFolder, SWT.NONE);
item.setText("item " + i);
Text text = new Text(tabFolder, SWT.BORDER | SWT.MULTI | SWT.VERTICAL);
text.setText("Text control for " + i);
item.setControl(text);
}
Listener listener = new Listener() {
boolean drag = false;
boolean exitDrag = false;
CTabItem dragItem;
Cursor cursorSizeAll = new Cursor(null, SWT.CURSOR_SIZEALL);
Cursor cursorIbeam = new Cursor(null, SWT.CURSOR_NO);
Cursor cursorArrow = new Cursor(null, SWT.CURSOR_ARROW);
public void handleEvent(Event e) {
Point p = new Point(e.x, e.y);
if (e.type == SWT.DragDetect) {
p = tabFolder.toControl(display.getCursorLocation()); // see eclipse bug 43251
}
switch (e.type) {
// 拖拉Tab
case SWT.DragDetect: {
CTabItem item = tabFolder.getItem(p);
if (item == null) {
return;
}
drag = true;
exitDrag = false;
dragItem = item;
// 换鼠标形状
tabFolder.getShell().setCursor(cursorIbeam);
break;
}
// 鼠标进入区域
case SWT.MouseEnter:
if (exitDrag) {
exitDrag = false;
drag = e.button != 0;
}
break;
// 鼠标离开区域
case SWT.MouseExit:
if (drag) {
tabFolder.setInsertMark(null, false);
exitDrag = true;
drag = false;
// 换鼠标形状
tabFolder.getShell().setCursor(cursorArrow);
}
break;
// 松开左键
case SWT.MouseUp: {
if (!drag) {
return;
}
tabFolder.setInsertMark(null, false);
CTabItem item = tabFolder.getItem(new Point(p.x, 1));
if (item != null) {
int index = tabFolder.indexOf(item);
int newIndex = tabFolder.indexOf(item);
int oldIndex = tabFolder.indexOf(dragItem);
if (newIndex != oldIndex) {
boolean after = newIndex > oldIndex;
index = after ? index + 1 : index/* - 1*/;
index = Math.max(0, index);
CTabItem newItem = new CTabItem(tabFolder, SWT.NONE, index);
newItem.setText(dragItem.getText());
Control c = dragItem.getControl();
dragItem.setControl(null);
newItem.setControl(c);
dragItem.dispose();
tabFolder.setSelection(newItem);
}
}
drag = false;
exitDrag = false;
dragItem = null;
// 换鼠标形状
tabFolder.getShell().setCursor(cursorArrow);
break;
}
// 鼠标移动
case SWT.MouseMove: {
if (!drag) {
return;
}
CTabItem item = tabFolder.getItem(new Point(p.x, 2));
if (item == null) {
tabFolder.setInsertMark(null, false);
return;
}
Rectangle rect = item.getBounds();
boolean after = p.x > rect.x + rect.width / 2;
tabFolder.setInsertMark(item, after);
// 换鼠标形状
tabFolder.getShell().setCursor(cursorSizeAll);
break;
}
}
}
};
tabFolder.addListener(SWT.DragDetect, listener);
tabFolder.addListener(SWT.MouseUp, listener);
tabFolder.addListener(SWT.MouseMove, listener);
tabFolder.addListener(SWT.MouseExit, listener);
tabFolder.addListener(SWT.MouseEnter, listener);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
分享到:
相关推荐
在Eclipse中使用SWT进行界面设计涉及到一系列关键概念和技术,包括SWT的起源与优势、SWT应用程序的组成以及开发环境的配置。 1. 为什么要使用SWT? SWT,全称Standard Widget Toolkit,是由IBM开发的一个跨平台的...
标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于64位Windows操作系统的SWT库。描述中提到的“64位windows操作系统使用的SWT库”进一步确认了这一点。 SWT的设计目标是...
### SWT Table单元格编辑功能详解 在Java图形用户界面(GUI)开发中,SWT(Standard Widget Toolkit)是一个广泛使用的工具包,它提供了丰富的控件集合,用于构建高性能的桌面应用程序。其中,`Table`控件是SWT中最...
org.eclipse.swt.custom.CTabFolder2Listener.class org.eclipse.swt.custom.CTabFolderAdapter.class org.eclipse.swt.custom.CTabFolderEvent.class org.eclipse.swt.custom.CTabFolderLayout.class org.eclipse....
SWT(Standard Widget Toolkit)是Eclipse项目的一个重要组成部分,它提供了一套用于构建图形用户界面(GUI)的API,与Java Swing不同,SWT基于操作系统原生的UI组件,因此能够实现更好的性能和与操作系统的集成。...
### SWT配置详解 #### 一、SWT简介与配置的重要性 SWT(Standard Widget Toolkit)是一种用于构建基于Java的应用程序的图形用户界面工具包。它提供了丰富的控件集,并能够生成本地外观和感觉的界面,这使得应用在...
下载编译的SWT库,版本号4.911,包含多个版本: org.eclipse.swt.cocoa.macosx.x86_64 org.eclipse.swt.gtk.linux.aarch64 org.eclipse.swt.gtk.linux.arm org.eclipse.swt.gtk.linux.ppc64le org.eclipse.swt.gtk....
### SWT JFace 按键、事件、监听 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台下的图形界面开发工具包,而JFace则是基于SWT之上的高级用户界面工具集。SWT提供了低级别的组件,用于创建跨平台的图形...
【标题】"swt-api swt DOC" 指的是一个关于SWT(Standard Widget Toolkit)API的文档,主要用于Java GUI(图形用户界面)开发。这个文档可能是开发者们在使用SWT进行界面设计时的重要参考资料。 【描述】"java界面...
Java平台上的图形用户界面(GUI)开发通常依赖于各种库和框架,DJNativeSwing和SWT(Standard Widget Toolkit)是其中两个重要的组件。本文将详细介绍这三个提及的JAR文件以及它们在Java应用中的作用。 首先,...
4. **可扩展性**: SWT允许开发者创建自定义控件,通过组合现有Widget实现新的功能。 5. **兼容性**: SWT支持多种操作系统,如Windows、Linux、macOS等,为跨平台开发提供了便利。 **使用SWT进行开发** 1. **初始...
SWT是由IBM公司为Eclipse集成开发环境设计的一种图形用户界面(GUI)工具包,它通过JNI(Java Native Interface)与底层操作系统紧密集成,提供了可移植的API,使得开发者可以创建与操作系统原生应用相似的外观和...
Java SWT(Standard Widget Toolkit)是Java平台上用于创建桌面应用程序的一个库,它提供了丰富的用户界面元素,如按钮、文本框、列表等。SWT是Eclipse IDE的基础,它通过与操作系统直接交互来提供本地化的图形用户...
根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...
SWT (Standard Widget Toolkit) 是一个开放源代码的Java库,用于在各种操作系统上创建图形用户界面(GUI)。它是Eclipse项目的一部分,提供了一种替代Java标准库AWT和Swing的方式,允许开发者构建与本机系统更加紧密...
SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中
SWT(Standard Widget Toolkit)是Java编程中用于创建图形用户界面(GUI)的一种库,它为开发者提供了丰富的控件和对话框。在SWT中,`MessageBox`是一个用于显示简单的消息对话框的类,通常用来向用户显示警告、确认...
这使得开发者可以在同一应用程序中同时使用Swing和SWT的优点,比如利用Swing的可移植性和SWT的高性能。 描述中提到了"swt开发需要的jar包,32位。需要在32为浏览器中使用",这意味着这个库是针对32位系统的,如果你...
通过这些脚本,开发者可以了解SWT如何被编译成可执行库。 2. `os_structs.c`、`os.c`:这些文件包含了与操作系统交互的结构体定义和函数实现。`os_structs.c` 可能包含了各种操作系统特定的数据结构,而 `os.c` ...
根据给定的信息,本文将详细介绍SWT(Standard Widget Toolkit)的相关知识点,包括其背景、特点、与AWT/Swing的对比以及如何开始使用SWT。 ### SWT简介 SWT(Standard Widget Toolkit)是一个开放源码的原生GUI...