Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.79.32] |
|
Сообщ.
#1
,
|
|
|
/** * * Внимание! При использовании данного класса рекомендуется запускать * JVM с установленным в {@code true} системным свойством {@code sun.awt.noerasebackground}. Это * устранит мерцания части меню, выходящей за пределы окна. * */ public class AnimatedPopupMenu extends JPopupMenu { public AnimatedPopupMenu() { } @Override public void show(final Component invoker, final int x, final int y) { Thread animatorThread = Executors.defaultThreadFactory().newThread( new Runnable() { public void run() { Dimension preferredSize = getPreferredSize(); float ratio = (float) preferredSize.width / (float) preferredSize.height; float w = 0, h = 0; while (true) { final Dimension size = getSize(); if (w >= preferredSize.width && h >= preferredSize.height) { break; } size.setSize( w = w + 4, h = h + 4 / ratio ); try { SwingUtilities.invokeAndWait( new Runnable() { public void run() { Window window = SwingUtilities.getWindowAncestor( AnimatedPopupMenu.this ); if (window instanceof JWindow && window.getClass().getEnclosingClass() == Popup.class) { window.setSize(size); } else { setPopupSize(size); } } } ); Thread.sleep(5L); } catch (InterruptedException thrown) { break; } catch (InvocationTargetException thrown) { throw new RuntimeException( thrown.getTargetException() ); } } } } ); setSize(0, 0); SwingUtilities.invokeLater( new Runnable() { public void run() { AnimatedPopupMenu.super.show(invoker, x, y); } }); animatorThread.start(); } } |