【问题标题】:Closing Child Shell with a Button like Red X button使用红色 X 按钮等按钮关闭子外壳
【发布时间】:2014-11-02 18:48:11
【问题描述】:

我有一个主要的父 shell 和一个子 shell。子外壳用于某些设置。设置完成后。我想关闭子 shell 并继续使用父 shell。我正在使用display_Settings.dispose(); 关闭子外壳。但这会关闭两个外壳(父母和孩子)。当我只单击子外壳的红色 X 按钮时,只有子外壳关闭。这就是我要的。我怎样才能实现它?此外,当子外壳打开时,可以操作/单击父外壳上的按钮。在我完成子 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 类是两个不同的类,下面是我打开 Parent 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();
    }
}

虽然 Display 变量不同,但两个 shell 都关闭,实际上它们的名称并不重要,因为它们都是不同的类。如果你能帮助我,我会很高兴!

【问题讨论】:

  • 请注意,您不需要多个事件循环(readAndDispatch() 的东西。一个就足够了。
  • @Baz readAndDispatch() 属于不同的对象?
  • 你有两个while 事件循环。您只需要 main 方法中的那个

标签: java shell swt


【解决方案1】:

下面是一个带有按钮的 Shell 示例,该按钮在选中时会打开一个模态子 Shell。

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();

在打开对话框外壳时阻止与主外壳的所有交互:这是通过SWT.APPLICATION_MODAL 样式标志实现的。 SWT.DIALOG_TRIM 样式标志将带有关闭按钮的标题栏添加到 shell,但在其他情况下不需要获得模态行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2015-11-10
    • 2013-09-07
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多