Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Infinite Borderless Canvas


Автор: User1302 23.9.2011, 16:11
Нужно сделать бесконечный холст Canvas.

Что имеется ввиду..

На холсте, например JComponent - обьекты, кот. себя отрисовывают с помощью переданной графики Graphics2D
По идее - интерфейс Renderer с методом paintRenderer(Graphics2D g);

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

Задача такова, что если компонент попадает в JViewPort, нужно автоматическое позиционирование скроллБаров в JViewPort.
То есть, при перетаскивании холста (AffineTrnsform.translate()), например, влево, задвинув при этом рисунок слева за границу родительского компонента,
должен появляться скроллбар, причем с нужной позицией ползунка - с правого края, или посередине примерно, если справа рисунок
также выходит за рамки родительского компонента.

То же самое должно происходить при перетаскивании не холста, а самого рисунка..

Первое что приходит в голову - поиграться с Translate, JviewPort.setViewPosition.
Задача, кажется, нетривиальна.
Также, предполагаемое мною решение не очень красивое и боюсь создавать велосипед...

Может, кто уже с подобным сталкивался?
В нете пока ничего не накопал

Автор: Skipy 23.9.2011, 17:05
Вы сами-то поняли, что написали? Как соотносится бесконечный холст с позицией ползунка? Если есть ползунок с текущей позицией, то его можно подвинуть как к началу, так и к концу. То есть холст по определению имеет начало и конец в каждом измерении. При бесконечном холсте ползунок всегда должен быть строго в центре, так как расстояние до краев в обе стороны бесконечно.

Автор: User1302 23.9.2011, 17:30
Бесконечный потому, что бесконечно (разумеется, в приемлемых пределах) можно перетаскивать рисунки в любую сторону.
При этом меняется только позиция ViewPort относительно рисунка с соответствующим размещением ползунком.
Ползунки автоматически располагаются таким образом, чтоб до рисунка можно было всегда добраться с помощью ползунков, куда бы его(рисунок) не потянул пользователь. Также, автоматически ползунки реагируют на перетаскивание самого холста с рисунком(операция translate(tx, ty)).

Получается, что preferredSize холста меняется в зависимости от изменения положения рисунка относительно видимой области.
Чем дальше мы затягиваем рисунок за границы видимой области холста(или перемещаем холст с рисунком), тем больше становится prefferedSize и, следовательно, тем меньше становятся ползунки и больше становятся области(полосочки), где можно передвигать эти самые ползунки, чтоб добраться до рисунка.

Чем ближе с помощью ползунков пользователь приближается к рисунку, тем меньше становится preferredSize холста, больше становятся ползунки и, когда рисунок опять оказывается перед пользователем (и полностью помещается в видимой области), ползунки пропадают вовсе.
При этом preferredSize холста по идее становится равным размеру рисунка, пропадает потребность в ползунках и они скрываются.

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

За формулировку извините, если не совсем понятно.
Попытаюсь что-нибудь накропать и выложить код.

Спасибо!

Автор: kamre 1.10.2011, 13:58
Цитата(Skipy @ 23.9.2011,  17:05)
Как соотносится бесконечный холст с позицией ползунка?

В теории, конечно, так и будет smile  А на практике обычно у всего рисунка есть bounding box и при перемещении viewport этот bounding box расширяется. Примерно так сделано в http://www.yworks.com/en/products_yed_about.html, т.е. там динамически подстраиваются скроллбары.

Автор: User1302 12.10.2011, 18:24
Цитата

Примерно так сделано в yEd

Смотрел я yEd - то, что нужно.
Жаль, код закрытhttp://forum.vingrad.ru/html/emoticons/pack/search.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)