Когда мой апплет запускается в первый раз из чистой среды, все работает путь я ожидаю. Я порождаю два потока, один для общей обработки, и один для графики. Я выполняю все вызовы управления 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 ! важно
читать?
Действительно ли важно
, восклицательный знак важен
,...?
Ответ: Из ответов ниже, кажется, читается просто важно
, или bang важно
.