Java: ScrollablePicture сделать прокрутку с заданными координатами - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь адаптировать следующий пример: http://docs.oracle.com/javase/tutorial/uiswing/examples/zipfiles/components-ScrollDemoProject.zip

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

В классе ScrollablePicture вы можете видеть, что можно перемещать изображение, перетаскивая мышь :

public void mouseDragged(MouseEvent e) {
    Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
    scrollRectToVisible(r);
}

Я пытался сделать то же самое, поэтому я добавил этот метод под функцией mouseDragged :

public void moveMap(float X, float Y){

    Rectangle r = new Rectangle((int)X,(int) Y, 1, 1);
    System.err.println("Scroll to "+ r.x);
    scrollRectToVisible(r);
}

Когда я смотрю свой вывод, я могувидите, что я получаю координаты в методе.Но окно не прокручивается .Мой вопрос сейчас: Почему это не прокрутка и как я могу это исправить?

Ps: Это не имеет ничего общего со значениями.Потому что я пытался с фиксированными числами в обеих функциях, например:

Rectangle r = new Rectangle(2000,2000, 1, 1);

Это работало в функции mouseDragged, но не в функции moveMap

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Ваш код работает нормально.

Вот как вы можете проверить это:

В классе ScrollDemo сделайте изображение public:

public ScrollablePicture picture;

В createAndShowGUI() изменить тип переменной JComponent newContentPane на:

ScrollDemo newContentPane = new ScrollDemo();

После frame.setVisible(true); вызвать ваш метод moveMap:

frame.setVisible(true);

newContentPane.picture.moveMap(1, 250);

СейчасВы можете видеть, что изображение прокручивается вниз, так что пиксель в (1, 250) виден:

enter image description here

Левая сторона: без вызова moveMap(1, 250);.Правая сторона: с вызовом.- момент после запуска приложения.

1 голос
/ 08 декабря 2011

вы можете двигаться с координатами от JViewPort, тогда ваш код должен быть

final JViewport viewport = scrollPane.getViewport();
Rectangle rect = new Rectangle((int)X,(int) Y, 1, 1);
Rectangle r2 = viewport.getVisibleRect();
contentsInTheJScrollPane.scrollRectToVisible(new Rectangle(rect.x, rect.y, 
     (int) r2.getWidth(), (int) r2.getHeight()));
...