2012-04-19 2 views
1

У меня есть фрактальная составляющая генерации (подкласс JPanel) внутри JFrame. Когда пользователь изменяет размер окна, требуется некоторое время, чтобы обновить фрактал до нового размера.Получать уведомления, когда пользователь заканчивает изменение размера JFrame

В настоящее время у меня есть компонент ComponentListener на JPanel, но его событие componentResized вызывается каждый раз, когда пользователь перемещает мышь при перетаскивании границы окна. Это означает, что фракталу предлагается многократно изменять размер, и медленно (в течение нескольких минут) растет до нового размера.

Есть ли способ получить уведомление, когда пользователь освобождает кнопку мыши, так что я могу изменить размер фрактала только тогда, когда пользователь закончил изменение размера?

Другие имеют reported это происходит, когда слушатель прикрепляется к JFrame вместо этого, но это не работает для меня (и others) по какой-то причине.

+0

Можете ли вы объяснить, почему кадр рендер медленно, может быть, что-то должно задуматься. –

+0

Обычно кадр проявляется довольно быстро, однако я в состоянии позволить пользователю вводить свои собственные фрактальные формулы в виде сценариев Lua. Я использую LuaJ для запуска скриптов, что замедляет рендеринг. –

+0

Делает ли что-нибудь существенное с фракталом при изменении размера окна? Если он просто «растянут», вы можете попробовать поместить его в «BufferedImage» и вместо этого покрасить изображение. –

ответ

3

Вместо того, чтобы начинать вычисления каждый раз, когда вы принимаете событие-получатель, вы можете только начать вычисление после того, как вы получили последнее событие, используя таймер, например. в псевдо-коде (или, по крайней мере, код, который я напечатал здесь непосредственно и не в моем IDE)

private Timer recalculateTimer = new Timer(20, myRecalculateActionListener); 

constructor(){ 
    recalculateTimer.setRepeats(false); 
} 
@Override 
public void componentResized(ComponentEvent e){ 
    if (recalculateTimer.isRunning()){ 
    recalculateTimer.restart(); 
    } else { 
    recalculateTimer.start(); 
    } 
} 

И вы все еще можете совместить это с Andrews предложением использовать изображение, которое вы растягиваться до тех пор, расчет фактически не закончил.

+1

много людей, много просмотров, я использую Boolean с таймером # перезапускаю внутри всех слушателей, +1 РЕДАКТИРОВАТЬ и важно на 350 -600 миллисекундах, потому что все хорошие медиаплееры получили примерно половину второй задержки, я думаю, что это дело довольно приемлемо – mKorbel

+1

Это работает отлично с немного более длительной задержкой. Благодаря! –

1
  • вы должны смотреть на HierarchyListener, где вы можете слушать для HierarchyEvent с интерфейсом для HierarchyBoundsListener

  • в основном ничего плохого ComponentListener, но вы должны оборачивать ожидаемые события в Swing Timer, в том случае, когда событие повторяется, только вызвать Timer#restart(), выход из Swing Timer должен быть Swing Action

+0

К сожалению, 'HierarchyBoundsListener' ведет себя так же, как' ComponentListener'. Однако я попытаюсь использовать таймер. Благодарю. –

+0

Хм, я только что предложил таймер, прежде чем он был включен в ваш комментарий. Мой ответ выглядит очень излишним. +1 для предложения – Robin

0

Немного поздно, но похоже, что никто не нашел правильного ответа. Я обнаружил, что когда вы вызываете child.updateUI() внутри блока ComponentListener (componentResized), этот ребенок сам изменяет его размер и обновляет его содержимое. Использование таймеров небезопасно.

Смежные вопросы