`

SWT 可拖拉的CTabFolder

阅读更多
   原本以为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进行界面设计

    在Eclipse中使用SWT进行界面设计涉及到一系列关键概念和技术,包括SWT的起源与优势、SWT应用程序的组成以及开发环境的配置。 1. 为什么要使用SWT? SWT,全称Standard Widget Toolkit,是由IBM开发的一个跨平台的...

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于64位Windows操作系统的SWT库。描述中提到的“64位windows操作系统使用的SWT库”进一步确认了这一点。 SWT的设计目标是...

    SWT Table单元格编辑功能

    ### SWT Table单元格编辑功能详解 在Java图形用户界面(GUI)开发中,SWT(Standard Widget Toolkit)是一个广泛使用的工具包,它提供了丰富的控件集合,用于构建高性能的桌面应用程序。其中,`Table`控件是SWT中最...

    org.eclipse.swt.win32

    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源码 swt.jar

    SWT(Standard Widget Toolkit)是Eclipse项目的一个重要组成部分,它提供了一套用于构建图形用户界面(GUI)的API,与Java Swing不同,SWT基于操作系统原生的UI组件,因此能够实现更好的性能和与操作系统的集成。...

    SWT配置 SWT配置 SWT配置 SWT配置 SWT配置

    ### SWT配置详解 #### 一、SWT简介与配置的重要性 SWT(Standard Widget Toolkit)是一种用于构建基于Java的应用程序的图形用户界面工具包。它提供了丰富的控件集,并能够生成本地外观和感觉的界面,这使得应用在...

    java界面库swt.jar 4.911

    下载编译的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 JFace 按键、事件、监听 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台下的图形界面开发工具包,而JFace则是基于SWT之上的高级用户界面工具集。SWT提供了低级别的组件,用于创建跨平台的图形...

    swt-api swt DOC

    【标题】"swt-api swt DOC" 指的是一个关于SWT(Standard Widget Toolkit)API的文档,主要用于Java GUI(图形用户界面)开发。这个文档可能是开发者们在使用SWT进行界面设计时的重要参考资料。 【描述】"java界面...

    DJNativeSwing-SWT.jar、DJNativeSwing.jar、swt-win-x64.jar

    Java平台上的图形用户界面(GUI)开发通常依赖于各种库和框架,DJNativeSwing和SWT(Standard Widget Toolkit)是其中两个重要的组件。本文将详细介绍这三个提及的JAR文件以及它们在Java应用中的作用。 首先,...

    swt工具文档 swt工具文档

    4. **可扩展性**: SWT允许开发者创建自定义控件,通过组合现有Widget实现新的功能。 5. **兼容性**: SWT支持多种操作系统,如Windows、Linux、macOS等,为跨平台开发提供了便利。 **使用SWT进行开发** 1. **初始...

    swt教程 有关SWT怎么应用

    SWT是由IBM公司为Eclipse集成开发环境设计的一种图形用户界面(GUI)工具包,它通过JNI(Java Native Interface)与底层操作系统紧密集成,提供了可移植的API,使得开发者可以创建与操作系统原生应用相似的外观和...

    java swt自定义控件

    Java SWT(Standard Widget Toolkit)是Java平台上用于创建桌面应用程序的一个库,它提供了丰富的用户界面元素,如按钮、文本框、列表等。SWT是Eclipse IDE的基础,它通过与操作系统直接交互来提供本地化的图形用户...

    swt table 实现换行

    根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...

    swt windows平台64位的包

    SWT (Standard Widget Toolkit) 是一个开放源代码的Java库,用于在各种操作系统上创建图形用户界面(GUI)。它是Eclipse项目的一部分,提供了一种替代Java标准库AWT和Swing的方式,允许开发者构建与本机系统更加紧密...

    SWT examples,SWT官方例子

    SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中

    SWT 弹出对话框 可以选择的图标种类

    SWT(Standard Widget Toolkit)是Java编程中用于创建图形用户界面(GUI)的一种库,它为开发者提供了丰富的控件和对话框。在SWT中,`MessageBox`是一个用于显示简单的消息对话框的类,通常用来向用户显示警告、确认...

    swt源码和jar包dj-native-swing-swt.jar

    这使得开发者可以在同一应用程序中同时使用Swing和SWT的优点,比如利用Swing的可移植性和SWT的高性能。 描述中提到了"swt开发需要的jar包,32位。需要在32为浏览器中使用",这意味着这个库是针对32位系统的,如果你...

    SWT源代码 SWT Source code

    通过这些脚本,开发者可以了解SWT如何被编译成可执行库。 2. `os_structs.c`、`os.c`:这些文件包含了与操作系统交互的结构体定义和函数实现。`os_structs.c` 可能包含了各种操作系统特定的数据结构,而 `os.c` ...

    SWT_全接触 SWT_全接触 SWT_全接触

    根据给定的信息,本文将详细介绍SWT(Standard Widget Toolkit)的相关知识点,包括其背景、特点、与AWT/Swing的对比以及如何开始使用SWT。 ### SWT简介 SWT(Standard Widget Toolkit)是一个开放源码的原生GUI...

Global site tag (gtag.js) - Google Analytics