Как узнать момент завершения изменения размера компонента

StackOverflow https://stackoverflow.com/questions/1281582

  •  16-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Я бы сказал, что вы, возможно, пишете какое-то картографическое приложение?:-)

Вы можете использовать класс Swing Timer, чтобы дождаться, пока не пройдет указанное количество времени без каких-либо событий.Вот код:

/** Time to wait */
private final int DELAY = 1000;
/** Waiting timer */
private javax.swing.Timer waitingTimer;

/**
 * Handle resize event.
 */
public void componentResized(ComponentEvent e) 
{
  if (this.waitingTimer==null)
  {
    /* Start waiting for DELAY to elapse. */
    this.waitingTimer = new Timer(DELAY,this);
    this.waitingTimer.start();
  }
  else
  {
    /* Event came too soon, swallow it by resetting the timer.. */
    this.waitingTimer.restart();
  }
}

/** 
 * Actual resize method
 */
public void applyResize()
{
  //...
}

/**
 * Handle waitingTimer event 
 */
public void actionPerformed(ActionEvent ae)
{
  /* Timer finished? */
  if (ae.getSource()==this.waitingTimer)
  {
    /* Stop timer */
    this.waitingTimer.stop();
    this.waitingTimer = null;
    /* Resize */
    this.applyResize();
  }
}

Другие советы

Боюсь, обычными средствами это невозможно. componentResized() будет вызываться при каждом изменении промежуточного размера, и невозможно определить, будет ли текущий вызов последним.

Строго говоря, то, что вы пытаетесь сделать, не является обычным делом.Загрузка данных может быть дорогостоящей операцией ввода-вывода, и ее обычно лучше всего выполнять, когда пользователь ожидает ее после более прямой операции пользовательского интерфейса, такой как нажатие кнопки, когда в результате его действия может быть отображена соответствующая обратная связь.Размер компонента может измениться по невинным причинам, например, если фрейм разворачивается или упорядочивается в результате какой-либо операции в другом месте, например новых операций Aero в Windows 7.

Некоторые приложения делать выполнить ввод-вывод в результате определения размера.Google Reader, например, может загружать старые сообщения из RSS-каналов в результате перемещения полосы прокрутки в окне браузера.Это хорошая функция, которая устраняет необходимость в явной кнопке загрузки, но она напрямую управляется пользователем, просматривающим старые сообщения;сознательное действие, а не бессознательное.

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

В своем вопросе вы даете очень мало информации о том, как выглядит ваш пользовательский интерфейс, что это за компонент и как его размер изменяется - даже о том, откуда вы загружаете данные, поэтому ответить сложно.Вот несколько предложений:Надеюсь, они помогут.

1.Предварительно загрузите данные в память и просто отобразите их.
Если модель данных не слишком велика, вы можете просто загрузить ее в память и быстро перерисовывать при каждом событии изменения размера.Event-Dispatch-Thread будет объединять события изменения размера вместе, чтобы ваш слушатель не был перегружен запросами.Возможно, это не для вас, но об этом стоит упомянуть.

2.Будьте готовы загрузить
Загрузите больше данных, чем вам нужно, при первом событии изменения размера, а затем либо отклоните, либо кэшируйте данные, которые вы не используете.Если вы заполняете строки таблицы или списка, это может быть лучшим подходом;табличные данные обычно легко загружаются и анализируются.

3.Подождите некоторое время, прежде чем изменение размера прекратится.
Первое событие изменения размера запускает таймер с обратным отсчетом в 1 секунду.Любые последующие события изменения размера сбрасывают обратный отсчет в 1 секунду.В какой-то момент произойдет окончательное событие изменения размера, после которого никакие последующие события изменения размера не сбросят обратный отсчет, поэтому его срок действия может истечь.На этом этапе таймер сделает всю работу за вас.

На мой взгляд, три — самый безопасный и точный подход.Вы можете сделать свое приложение более отзывчивым, визуально указав, что данные загружаются при первом событии изменения размера, и отрегулировать обратный отсчет таймера, чтобы ваше приложение правильно воспринималось.

Это невозможно.Но вы можете использовать Одиночный рабочий поток минимизировать количество обрабатываемых событий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top