Изменение размера клиента JScrollPane без прокручивания полос прокрутки

У меня есть JScrollpane, который содержит прокручиваемый клиент, который динамически меняет свой размер при использовании приложения. Я хочу, чтобы JScrollPane знал об изменениях, не перемещая область просмотра при изменении размера клиента.

Чтобы пояснить, что я имею в виду: обратитесь к примеру Java Webstart ScrollDemo2 из статьи Sun Как использовать области прокрутки. При щелчке в нижней части окна круг появляется частично за пределами окна, а полосы прокрутки перемещаются. Это последнее поведение, которого я хочу избежать.

Я предполагаю, что это просто вопрос установки простого флага в одном из многих компонентов, которые участвуют в решении панели прокрутки, но я просто не могу найти, где он находится. Кто-нибудь знает?


person Bulgur    schedule 14.12.2009    source источник


Ответы (2)


Мне удалось решить эту проблему, переопределив стандартное поведение окна просмотра в моем JScrollPane. Это может быть решение, которое не подходит для всех, но в моем графическом интерфейсе это работает как шарм.

JScrollPane pane = new JScrollPane();
pane.setViewport(
  new JViewport(){
    /**
     * An empty override implementation to prevent undesired scrolling on
     * size changes of the client.
     */
     @Override
     public void scrollRectToVisible(Rectangle rect){}
  });
person Bulgur    schedule 15.12.2009

Я бы попробовал что-то вроде:

Point p = scrollPane.getViewport().getViewportPosition();
revalidate();
scrollPane.getViewport().setViewportPosition(p);

Возможно, вам придется обернуть последнюю строку кода в файл SwingUtilities.invokeLater.

Если это не сработает, то, возможно, вы можете отключить/включить область просмотра до и после повторной проверки ()?

person camickr    schedule 14.12.2009
comment
Возможно, это сработает при определенных обстоятельствах, но проблема в моем случае заключается в том, что класс JScrollPane, который содержит мой JScrollPane, не знает об изменениях размера в клиенте. Это означает, что я не могу добраться до области прокрутки, откуда происходят изменения. По крайней мере, без поиска вверх по иерархии, чего я хочу избежать. Более того, я действительно думаю, что есть простое и понятное решение этого, но я просто не знаю об этом :). - person Bulgur; 14.12.2009
comment
В примере, на который вы ссылаетесь, решение состоит в том, чтобы просто удалить метод scrollRectToVisible(). В противном случае поиск вверх будет простым, потому что панель будет добавлена ​​в область просмотра, поэтому вам просто нужно получить родителя панели, для которой вы меняете предпочтительный размер. Я заметил, что когда вы добавляете JTextArea на панель в области прокрутки, область просмотра имеет тенденцию прокручиваться до текстовой области. Если вы не опубликуете SSCCE, показывающий реальную проблему, я не знаю, как еще мы можем помочь. - person camickr; 14.12.2009
comment
Я вижу, что ScrollDemo2 был неудачным примером. Как вы заметили, поведение явно задается методом scrollRectToVisible(). К сожалению, очень сложно предоставить SSCCEE для моей проблемы, потому что это часть довольно большого и сложного графического интерфейса. Скорее всего, проблема в том, что я сделал какую-то глупость в одном из множества вложенных классов компонентов. Тем не менее, ваш пост все равно указал мне правильное направление и помог мне решить проблему. Выкладываю решение ниже. - person Bulgur; 15.12.2009