SWT应用程序:可拖动标签是否可行?

时间:2015-04-20 02:13:24

标签: java swt

我正在使用SWT构建Java应用程序。该应用程序的一个要求是它有多个窗口。而不是永远独立" Windows,我认为在大多数浏览器中实现一个功能很酷,你可以在其中有一个单一的表格窗口,其中每个标签都可以拖出来创建一个单独的窗口。在使用Google进行一些研究后,似乎可以完成此using JavaFX,但是在SWT中实现相同的功能是否可能(并且相对容易)?提前致谢。

1 个答案:

答案 0 :(得分:0)

虽然我的观点可能有点迟了,但仍然存在。下面的代码片段是一个粗略的POC,允许从CTabFolder拖动项目,当项目被删除到文件夹的边界之外时,会打开一个shell来显示项目'内容。

public static void main( String[] args ) {
  Display display = new Display();
  final Shell shell = new Shell( display );
  shell.setLayout( new FillLayout() );
  final CTabFolder folder = new CTabFolder( shell, SWT.BORDER );
  for( int i = 0; i < 4; i++ ) {
    CTabItem item = new CTabItem( folder, SWT.CLOSE );
    item.setText( "Item " + i );
    Text text = new Text( folder, SWT.MULTI );
    text.setText( "Content for Item " + i );
    item.setControl( text );
  }
  Listener dragListener = new Listener() {
    private CTabItem dragItem;

    public void handleEvent( Event event ) {
      Point mouseLocation = new Point( event.x, event.y );
      switch( event.type ) {
        case SWT.DragDetect: {
          CTabItem item = folder.getItem( mouseLocation );
          if( dragItem == null && item != null ) {
            dragItem = item;
            folder.setCapture( true );
          }
          break;
        }
        case SWT.MouseUp: {
          if( dragItem != null && !folder.getBounds().contains( mouseLocation ) ) {
            popOut( dragItem, folder.toDisplay( mouseLocation ) );
            dragItem.dispose();
            dragItem = null;
          }
          break;
        }
      }
    }
  };
  folder.addListener( SWT.DragDetect, dragListener );
  folder.addListener( SWT.MouseUp, dragListener );
  shell.pack();
  shell.open();
  while( !shell.isDisposed() ) {
    if( !display.readAndDispatch() )
      display.sleep();
  }
  display.dispose();
}

private static void popOut( CTabItem tabItem, Point location ) {
  Control control = tabItem.getControl();
  tabItem.setControl( null );
  Shell itemShell = new Shell( tabItem.getParent().getShell(), SWT.DIALOG_TRIM | SWT.RESIZE );
  itemShell.setLayout( new FillLayout() );
  control.setParent( itemShell );
  control.setVisible( true ); // control is hidden by tabItem.setControl( null ), make visible again
  itemShell.pack();
  itemShell.setLocation( location );
  itemShell.open();
}

虽然此示例使用CTabFolder,但也应该可以使用(本机)TabFolder代替。

当然,缺少的是拖动项目时的视觉反馈和中止拖动操作的手段(例如Esc键),还有更多的东西......