Отключить кнопку закрытия в диалоговом окне Java JFace? - PullRequest
3 голосов
/ 02 ноября 2010

Как я могу отключить кнопку закрытия (или сделать так, чтобы она полностью исчезла, если это возможно) в Java-диалоге JFace?

Ответы [ 4 ]

12 голосов
/ 03 ноября 2010

Кнопки в диалоге создаются с помощью метода createButton ().Чтобы «отфильтровать» кнопку отмены, вы можете переопределить ее следующим образом:

protected Button createButton(Composite parent, int id,
        String label, boolean defaultButton) {
    if (id == IDialogConstants.CANCEL_ID) return null;
    return super.createButton(parent, id, label, defaultButton);
}

Однако кнопка закрытия диалога (предоставляемая ОС) по-прежнему работает.Чтобы отключить его, вы можете переопределить canHandleShellCloseEvent ():

protected boolean canHandleShellCloseEvent() {
    return false;
}

Вот полный, минимальный пример:

package stackoverflow;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class JFaceDialogNoCloseButton {
    private static final Display DISPLAY = Display.getDefault();

    public static void main(String[] args) {
        Shell shell = new Shell(DISPLAY, SWT.CLOSE | SWT.RESIZE);
        shell.setSize(200, 100);
        shell.setLayout(new FillLayout());

        final Dialog dialog = new InputDialog(shell, "Title", "Message",
                "initial value", null) {
            @Override
            protected Button createButton(Composite parent, int id,
                    String label, boolean defaultButton) {
                if (id == IDialogConstants.CANCEL_ID)
                    return null;
                return super.createButton(parent, id, label, defaultButton);
            }

            @Override
            protected boolean canHandleShellCloseEvent() {
                return false;
            }
        };

        Button button = new Button(shell, SWT.PUSH);
        button.setText("Launch JFace Dialog");
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dialog.open();
            }
        });

        shell.open();

        while (!shell.isDisposed()) {
            if (!DISPLAY.readAndDispatch()) {
                DISPLAY.sleep();
            }
        }
        DISPLAY.dispose();
    }
}
9 голосов
/ 29 октября 2011

Чтобы кнопка X не отображалась в диалоге, необходимо отключить свойство стиля SWT.CLOSE.Важно отметить, что это должно быть сделано до открытия диалогового окна, поэтому в конструкторе вашего диалога будет работать.

public NoCloseDialog(...){
    super(...);
    setShellStyle(getShellStyle() & ~SWT.CLOSE);
}

Стиль оболочки по умолчанию для окна JFace - SWT.SHELL_TRIM, что равноSWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.RESIZE

8 голосов
/ 03 ноября 2010

См. здесь для примера, показывающего, как скрыть кнопку закрытия в Dialog. Вы просто переопределяете следующий метод:

protected void setShellStyle(int arg0){
    //Use the following not to show the default close X button in the title bar
    super.setShellStyle(SWT.TITLE);
}

В противном случае переопределить close() и вернуть false, чтобы предотвратить закрытие.

Обновление : Хотя приведенный выше код "решает" проблему под рукой, он ничего не объясняет и вносит неприятную ошибку. Пожалуйста, смотрите ответ Гуга, для лучшей версии.

1 голос
/ 01 июня 2011

Для диалога, расширенного с org.eclipse.jface.dialogs.Dialog, переопределение canHandleShellCloseEvent у меня не сработало, Тогда закрытие всего приложения стало хорошей стратегией для моей ситуации, потому что я должен был сделать то же самое, если пользователь решил отменить.

Я знаю, что это не точный ответ на вопрос, но его можно использовать в качестве обходного пути для разрешения ситуации.

при open() или createContents() методе,

shell.addListener(SWT.Close, new Listener() { 

            public void handleEvent(Event event) {
                System.exit(0);
            }

     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...