| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
В теории, конечно, так и будет |
| Автор: User1302 12.10.2011, 18:24 | ||
Смотрел я yEd - то, что нужно. Жаль, код закрытhttp://forum.vingrad.ru/html/emoticons/pack/search.gif |