Виджет расположен - PullRequest
       11

Виджет расположен

0 голосов
/ 26 июля 2010

Доброго всем скорби

У меня есть главный экран со следующими сочетаниями клавиш:

shell.getDisplay().addFilter(SWT.KeyUp, new Listener() {
    @Override
    public void handleEvent(Event event) {
        switch (event.keyCode) {
        case SWT.ESC:
            shell.close();
            break;
        case SWT.F12:
            display.syncExec(new Runnable() {
                @Override
                public void run() {
                new Venda(shell);
                }
            });                 
            break;                  
        default:
            break;
        }               
    }
});

При нажатии F12 открывается экран поиска.Экран конструктора продаж:

public Venda(Shell parent) {
        super(parent);
        this.shell = new Shell(getParent(),SWT.APPLICATION_MODAL);
        this.display = getParent().getDisplay();
        this.shell.setMaximized(true);
        this.shell.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN));
        this.fontText = new Font(shell.getDisplay(), new FontData("Arial", 28, SWT.NORMAL));
        this.fontLabel = new Font(shell.getDisplay(), new FontData("Arial", 13, SWT.NORMAL));
        this.shell.setText("Cupom Fiscal - Venda Produto");
        this.criaCampos();
        this.configuraTeclaAtalho();
        this.shell.open();
        while (!display.isDisposed()) {
            if (!display.isDisposed() && !display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

Когда вы нажимаете F3 на экране продажи, открывается экран поиска.Моя проблема: Когда экран продажи открывается в первый раз, экран поиска работает нормально, но если экран продажи закрывается и открывается снова, экран поиска не работает, выдавая ошибку: Виджет уничтожен.Ошибка происходит в строке 02, в исходном коде следует.Переменная «abreFechaCaixa» проверяет, должен ли быть открыт экран продажи.

    if(!abreFechaCaixa){
        MessageBox msg = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO);
        msg.setMessage("Caixa Fechado, deseja abrir?");
    msg.setText(shell.getText());
    if(msg.open() == SWT.YES){
        abreCaixa();
    }
    }
if(abreFechaCaixa){
    display.syncExec(new Runnable() {
        @Override
    public void run() {
                new Consulta(shell,"Cupom Fiscal - Consulta Produto");
    }
    });
}

Экран поиска конструктора:

public Consulta(Shell parent) {
                super(parent);
        this.shell = new Shell(parent, SWT.APPLICATION_MODAL);
        this.display = getParent().getDisplay();
        this.shell.setText(tituloTela);
        this.shell.setLayout(new GridLayout(1, false));
        this.fontText = new Font(shell.getDisplay(), new FontData("Arial", 28, SWT.NORMAL));
        this.fontLabel = new Font(shell.getDisplay(), new FontData("Arial", 13, SWT.NORMAL));
        this.criaCampos();
        this.shell.pack();
        this.centralizaTela();
        this.shell.open();
        while (!shell.isDisposed()) {
            if (!display.isDisposed() && !display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

Можете ли вы помочь мне решить эту проблему?Или показать лучший способ закрыть окна в SWT?Спасибо!

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Чтобы решить мою проблему, я разделил процесс на потоки.

0 голосов
/ 01 августа 2010

Вам не нужен цикл while в классе Consulta, так как Shell является потомком Venda. Это означает, что экранный объект дочерней оболочки совпадает с его родительским; поэтому в вашей конструкции выполнение readAndDispatch() над этим дисплеем выполняется дважды.

0 голосов
/ 26 июля 2010

Я думаю, вам нужно добавить "display.dispose ();"после цикла while для! shell.isDisposed ().Нравится следующее:

 while (!shell.isDisposed()) {
    if (!display.readAndDispatch()){
       display.sleep();
    }
  }
 display.dispose ();
...