2012-12-30 1 views
0

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

for(int i = 150; i <= width; i += 3) { 
    dialog.setSize(i, 80); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e2) {} 
} 

for(int i = 80; i <= 200; i++) { 
    dialog.setSize(width, i); 

    try { 
     Thread.sleep(1); 
    } catch(Exception e3) {} 
} 

Когда код будет выполнен, потребуется некоторое время, а затем JDialog будет показан растянутым. Не отображается расширение.

Ну, когда пользователь снова нажимает на диалог, он отменит открытие анимации и закроется.

for(int i = 200; i >= 80; i--) { 
    newMsg.setSize(width, i); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e4) {} 
} 

for(int i = 0; i >= -width; i -= 3) { 
    newMsg.setLocation(i, 100); 

    try { 
     Thread.sleep(0, 1); 
    } catch(Exception e5) {} 
} 

Этот продукт работает правильно. Движение можно увидеть. Насколько я понимаю, эти коды идентичны, за исключением того, что они меняются на противоположные. Почему открытие не работает, как ожидается, но закрытие?

+0

Попробуйте с помощью качающийся таймер, а не цикл. Я думаю, что события просто застревают в очереди событий, а затем все выполняются сразу. – DankMemes

+0

Хотелось бы посмотреть, как вы это сделаете. Я прокомментировал сообщение Reimeus и объяснил ... – MikkoP

+0

Возможный дубликат [использование sleep() для одной темы] (http://stackoverflow.com/questions/14074329/using-sleep-for-a-single-thread) –

ответ

4

Не звоните Thread.sleep в EDT. Это приводит к «зависанию» пользовательского интерфейса. Вместо этого вы можете использовать здесь Swing Timer. Вот как начальная «расширить» может быть обработано ::

Timer timer = new Timer(0, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    updateDialogSize(); 
    } 
}); 

timer.setDelay(5); // short delay 
timer.start(); 

диалоговое окно Update:

void updateDialogSize() { 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    if (dialog.getWidth() < screenSize.getWidth()) { // 1st size width 
     dialog.setSize(dialog.getWidth() + 5, dialog.getHeight()); 
    } else if (dialog.getHeight() < screenSize.getHeight()) { // then size height 
    dialog.setSize(dialog.getWidth(), dialog.getHeight() + 5); 
    } else { 
     timer.stop(); // work done 
    } 

    dialog.setLocationRelativeTo(myFrame); 
} 

Я оставлю диалоговое «сокращение», как физические упражнения;)

+0

Укажите код. Я не могу понять, как это должно быть сделано. Я пытался сделать это с помощью таймера, но я не совсем понял ... Мне нужно несколько таймеров, которые заставляют меня определять ActionListener внутри инициализации таймера, что в свою очередь заставляет меня не остановить таймер внутри ActionListener. – MikkoP

+0

Спасибо Reimeus! Теперь он работает так, как предполагалось. – MikkoP