Проблема с изменением значения JScrollBars в JScrollPane: 90, по-видимому, является магическим числом

Итак, моя основная предпосылка заключается в том, что у меня есть следующая настройка (http://imgur.com/qgwaYEn.png< /а>):

Основной графический интерфейс

И моя проблема только в отношении главного окна изображения. Все маленькие черные прямоугольники окружают POI, выбранные детектором Харриса, и я хочу, чтобы пользователь выбрал подмножество квадратов для отправки в качестве основы обучающего набора. Как видно (внизу справа), я могу сделать поля красными, когда на них нажимают, и я делаю это, перерисовывая изображение, а затем изменяя верхний компонент панели JSplit на новый JScrollPane, который является JLabel, который инкапсулирует значок изображения.

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

НО, это работает только для одного из них. Это так странно. Первый всегда работает нормально, второй же по умолчанию равен 90, независимо от того, как он установлен.

Соответствующий сегмент кода:

int scrollHoriz = view_scroll.getHorizontalScrollBar().getValue();
int scrollVerti = view_scroll.getVerticalScrollBar().getValue();
System.out.println("OLD Horizontal Position: " + view_scroll.getHorizontalScrollBar().getValue());
System.out.println("OLD Vertical Position: " + view_scroll.getVerticalScrollBar().getValue());
System.out.println("Horiz: " + scrollHoriz);
System.out.println("Verti: " + scrollVerti + "\n");

view_scroll = new JScrollPane();
view_scroll.getViewport().add(new JLabel(new ImageIcon(theImage)));
view_scroll.getHorizontalScrollBar().setUnitIncrement(12);
view_scroll.getVerticalScrollBar().setUnitIncrement(12);
view_scroll.getViewport().getView().addMouseListener(new TrainingMousePress(this));

view_scroll.getVerticalScrollBar().setValue(scrollVerti);
view_scroll.getHorizontalScrollBar().setValue(scrollHoriz);

System.out.println("NEW Horizontal Position: " + view_scroll.getHorizontalScrollBar().getValue());
System.out.println("NEW Vertical Position: " + view_scroll.getVerticalScrollBar().getValue());
System.out.println("Horiz: " + scrollHoriz);
System.out.println("Verti: " + scrollVerti);

view.remove(view.getTopComponent());
view.setTopComponent(view_scroll);
view.setDividerLocation(600);

return;

Что будет распечатано (при щелчке любого поля):

  • СТАРАЯ Горизонтальная позиция: 216
  • СТАРАЯ Вертикальная позиция: 360
  • Горизонт: 216
  • Верти: 360
  • НОВОЕ Горизонтальное положение: 90
  • НОВОЕ Вертикальное положение: 360
  • Горизонт: 216
  • Верти: 360

И если вы инвертируете два сеттера так:

view_scroll.getHorizontalScrollBar().setValue(scrollHoriz);
view_scroll.getVerticalScrollBar().setValue(scrollVerti);

Ты получаешь:

  • СТАРАЯ Горизонтальная позиция: 569
  • СТАРАЯ Вертикальная позиция: 510
  • Гориз: 569
  • Верти: 510
  • НОВАЯ Горизонтальная позиция: 444
  • НОВОЕ Вертикальное положение: 90
  • Горизонт: 444
  • Верти: 474

Противоположное поведение, но 90 все равно назначается второму бару.

Любые предложения будут более чем приветствоваться. :)


person user3727820    schedule 10.06.2014    source источник
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный и проверяемый пример). Кстати, общеизвестно, что если какое-либо число содержит магию, то это 42. ;)   -  person Andrew Thompson    schedule 11.06.2014


Ответы (1)


Вместо сохранения отдельных значений полос прокрутки сохраните положение окна просмотра:

Point saved = scrollPane.getViewport().getViewPosition();

Затем вы можете восстановить позицию, используя:

scrollPane.getViewport().setViewPosition( saved );

Кроме того, убедитесь, что весь код выполняется в потоке отправки событий при обновлении графического интерфейса.

person camickr    schedule 11.06.2014