原本以为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();
}
分享到:
相关推荐
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....
6.4 自定义选项卡(CTabFolder ) 83 6.4.1 带有“关闭”按钮的选项卡 84 6.4.2 带有边框的选项卡 85 6.4.3 显示“最大化/最小化”按钮 85 6.4.4 设置选项卡的颜色和背景图片 85 6.4.5 仿Eclipse编辑区的...
`CTabFolder`是自定义选项卡,提供了更多的样式和功能,如设置标签颜色、高度和位置。 【带滚动条的面板(ScrolledComposite)】 当组件数量超出屏幕范围时,`ScrolledComposite`可以添加滚动条。不过需要注意,...
- **特殊控件**:包括专为Workbench设计的一些特殊控件,如CTabFolder、CBanner等。 - **可编辑组合框**:新的组合框控件允许用户输入。 - **改进的树结构**:增强了树控件的功能,支持列视图。 - **表格增强**:...
有用的链接Java / Eclipse SWT文档-SashForm,CTabFolder等笔记将.mov转换为.gif并尝试优化ffmpeg -i 21-01-24_snap_demo.mov -pix_fmt rgb24 -r 24 -s 1440x900 snap_demo1.gifconvert -layers Optimize snap_demo1...
#org-eclipse-ui-editorss CTabFolder.MPartStack { swt-single: true; } ``` 同时,还可以修改标签的样式,比如切换到经典的2.1和3.x风格,或者调整标签的字体大小。例如,减少标签字体大小的CSS代码如下: ```css...