Miglayout + hidemode 3 = нежелательная автопрокрутка при отображении элементов управления - PullRequest
1 голос
/ 27 февраля 2011

Я использую 'hidemode 3' в MigLayout, чтобы скрытые компоненты вообще не были видны (и не влияли на макет).

Я использую это для отображения встроенных ошибок под текстовыми полями, которые отображаются только при наличии ошибки

Всякий раз, когда я показываю эти встроенные блоки ошибок (они являются текстовыми областями, поэтому я просто вызываю setVisible (true)), панель прокрутки, в которую встроена форма, автоматически прокручивается вниз к тому, что устанавливается видимым (поэтому я вызываю setVisible (true) ) что-то вызывает изменение макета, и область прокрутки автоматически прокручивается вниз, где бы ни находился компонент)

Теперь, это не проблема - я думаю, я понимаю, почему вышеупомянутая часть происходит (предположительно, изменение размера панели, чтобы приспособить новый макет, завинчивает масштаб полосы прокрутки, таким образом, появляется прокрутить вниз)

Что я не могу понять, так это как обойти это - например, я пытался сделать это:

// validateModel will cause the setVisible() calls to occur 
if (!syncControl_.validateModel())
{
    // Here I try and counteract the layout change by going back 
    // to the top 
    variableScrollPane_.getViewport().setViewPosition(new Point(0,0));
}

Но это не работает - точнее, оно работает на мгновение: прокрутка происходит, но кажущаяся «автоматическая прокрутка» происходит через несколько миллисекунд. Кажется, что бы ни повторял макет, либо вызывается через регулярные промежутки времени, либо setVisible фактически запускает какое-то событие

Я пытался вызвать validate (), invalidate () repaint () и т. Д. До изменения прокрутки, но безрезультатно.

Итак, я предполагаю, что мой вопрос: когда я использую hidemode 3 и вызываю setVisible (), какой метод «реагирует»? Это происходит во время валидации / doLayout () и т. Д. Или происходит нечто совершенно отдельное?

Спасибо

1 Ответ

0 голосов
/ 03 марта 2011

Просто случайно ответил на мой собственный вопрос:

SwingUtilities.invokeLater(new Runnable() {
      public void run() {
           variableScrollPane_.getVerticalScrollBar().setValue(0);                
      }            
}); 

Оказывается, MigLayout не учитывает это вообще (и кажется, что вышеизложенный является хорошо известным механизмом сброса scrollbarво многих ситуациях)

...