Java 使用类似红色X按钮的按钮关闭子外壳

Java 使用类似红色X按钮的按钮关闭子外壳,java,shell,swt,Java,Shell,Swt,我有一个主父shell和一个子shell。子shell用于某些设置。设置完成后。我想关闭子shell并继续使用父shell。我正在使用display_Settings.dispose()关闭子shell。但这会关闭两个壳(父壳和子壳)。当我只单击子外壳的红色X按钮时,只有子外壳关闭。这就是我想要的。我怎样才能做到呢?此外,当子shell打开时,还可以操纵/单击父shell上的按钮。在完成子shell中的设置之前(在关闭子shell之前),我想禁止这样做 下面是如何在父shell中打开子shell

我有一个主父shell和一个子shell。子shell用于某些设置。设置完成后。我想关闭子shell并继续使用父shell。我正在使用
display_Settings.dispose()
关闭子shell。但这会关闭两个壳(父壳和子壳)。当我只单击子外壳的红色X按钮时,只有子外壳关闭。这就是我想要的。我怎样才能做到呢?此外,当子shell打开时,还可以操纵/单击父shell上的按钮。在完成子shell中的设置之前(在关闭子shell之前),我想禁止这样做

下面是如何在父shell中打开子shell:

    btnSettings.addListener (SWT.Selection, new Listener () {
        @Override
        public void handleEvent (Event event) { // Button Settings event
            try {
                my_Obect = new My_Object();
                Display display_Settings = Display.getDefault();
                Child_Settings shell_Settings = new Child_Settings(display_Settings, my_Object);
                shell_Settings.open();
                shell_Settings.layout();
                while (!shell_Settings.isDisposed()) {
                    if (!display_Settings.readAndDispatch()) {
                        display_Settings.sleep();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
父GUI类和子GUI类是两个不同的类,下面是我如何打开父shell的:

public static void main(String args[]) {

    try {
        Display display = Display.getDefault();
        GUI_Test shell = new GUI_Test(display);
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

尽管显示变量不同,但两个shell都是闭合的,实际上它们的名称并不重要,因为它们都是不同的类。如果你能帮助我,我会很高兴的

下面是一个Shell示例,其中有一个按钮,在选中时可选择模式子Shell

当对话框外壳打开时,所有与主外壳的交互都被阻止:这是通过
SWT.APPLICATION\u MODAL
style标志实现的。
SWT.DIALOG\u TRIM
style标志在shell中添加了一个带有关闭按钮的标题栏,但在获取模态行为时不需要它


可以使用
Esc
关闭对话框外壳。代码段末尾的主循环使应用程序保持活动状态,直到主shell关闭。

请注意,您不需要多个事件循环(
readAndDispatch()
stuff)。一个就足够了。@Baz
readAndDispatch()
属于不同的对象?您有两个
while
事件循环。您只需要在
main
方法中使用一个
Display display = new Display();
final Shell shell = new Shell( display );
shell.setText( "Shell" );
shell.setSize( 200, 200 );
shell.setLayout( new FillLayout() );
Button button = new Button( shell, SWT.PUSH );
button.setText( "Open Modal Child Shell" );
button.addListener( SWT.Selection, new Listener() {
  @Override
  public void handleEvent( Event event ) {
    Shell dialog = new Shell( shell, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM );
    dialog.setText( "Dialog" );
    dialog.setSize( 200, 200 );
    dialog.open();
  }
} );
shell.open();
while( !shell.isDisposed() ) {
  if( !display.readAndDispatch() ) {
    display.sleep();
  }
}
display.dispose();