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