Корректная обработка перезагрузки из AppletViewer

Когда мой апплет запускается в первый раз из чистой среды, все работает путь я ожидаю. Я порождаю два потока, один для общей обработки, и один для графики. Я выполняю все вызовы управления GUI из потока диспетчеризации событий. Запуск/остановка обрабатывается правильно с помощью апплетевера, но перезапуск/перезагрузка - это нет. У меня есть Холст с именем drawCanvas в качестве единственного компонента в области содержимого апплета, и я использую двойную буферизацию, чтобы нарисовать его.

Я наблюдаю проблему здесь:

public void start() {   
    /* ... some stuff  */
    executeOnEDTAndWait( 
        new Thread() {
            @Override 
            public void run() {
                /* ... more stuff ... */
                setupDrawCanvas();

                if( drawCanvas.isDisplayable() ) {
                    drawCanvas.createBufferStrategy(2); 
                    /* ... some more stuff */
                } else {
                    /* This is where it runs into difficulties */
                }
    /* ... */

Где setupDrawCanvas определяется так:

private void setupDrawCanvas() {
    setVisible(false);
    setIgnoreRepaint(true);

    getContentPane().removeAll();

    drawCanvas = new Canvas();

    drawCanvas.setName("drawCanvas");
    drawCanvas.setSize(
    newDrawCanvasDimension.width, 
    newDrawCanvasDimension.height);
    drawCanvas.setIgnoreRepaint(true);

    getContentPane().add(drawCanvas);

    getContentPane().setVisible(true);
    drawCanvas.setVisible(true);
    setVisible(true);
}

Также, вот соответствующий код в destroy ()

public void destroy() {
    /* .. some stuff .. */

    /* dispose of drawCanvas */
    drawCanvas.setVisible(false);
    if( drawCanvas.getBufferStrategy() != null ) {
        drawCanvas.getBufferStrategy().dispose();
    }

    /* reset and disable the applet's GUI */
    setVisible(false);
    getContentPane().removeAll();
    removeAll();

    /* .. some more stuff */

Первый раз через, все работает нормально. При перезапуске из appletviewer вызывается первый stop () , в результате чего все мои потоки переходят в состояния ожидания. Затем вызывается destroy () , который снова запускает все мои потоки и позволяет им выйти, а также и invokeAndWait () на EDT, чтобы очистить мои виджеты и сделать setVisible (false). Таким образом, после завершения уничтожения appletviewer снова вызывает init/start, и процесс повторяется точно так же, как и раньше, за исключением того, что происходит сбой в start () в области, указанной выше.

Что-то, что я заметил, что для меня было очень мало смысла в том, что если я клонировал апплет с помощью appletviewer , а затем перезагрузил клон, все будет работать так, как ожидалось, когда я попытался перезапустить или перезагрузить клон в первый раз, но потерпит крах, за исключением второго раза.

Что-то еще я заметил, пытаясь отладить эту проблему, заключается в том, что appletviewer и браузер действуют совершенно иначе, как хосты моего апплета; они даже не вызывают init () и start () при одинаковых условиях. Кроме того, перезапуск и перезагрузка - это не что иное, как вызов stop () - > destroy () - > init () - > start () , но с незначительными изменениями

Таким образом, мой вопрос заключается в том, какова значимость операций перезапуска и перезагрузки (т.е. когда они используются), и является ли проблема, что мой апплет не работает в апплетевере, когда они происходят?

-121--1092379- Как вы читаете! важно в CSS? Как CSS Это действительно важно, восклицательный знак важен,...? Ответ: Из ответов ниже, кажется, прочитано просто важно, или bang важно.

Как свойство атрибута CSS ! важно читать?

Действительно ли важно , восклицательный знак важен ,...?

Ответ: Из ответов ниже, кажется, читается просто важно , или bang важно .

41
задан hippietrail 27 September 2012 в 07:26
поделиться