|
|
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Приветствую, создал клас производный от JPanel, это типа холст и на нём рисую. Добавил масштабирование, при помощи AffineTransform, теперь интересует, как добавить скролинг, чтобы при увеличении масштаба, можно было скролбарами двигать картинку. Вижу несколько вариантов: 1. Поместить свой холст в JScrollPane и при изменении масштаба, изменять preferedSize у холста, тогда больше вроде как ничего делать не надо будет, скролбары будут сами менять размер и всё будет работать. 2. Добавить два отдельных скролбара и рулить ими самостоятельно. 3. Вроде как можно унаследоваться от Scrollable интерфейса и переопределить все необходимые методы самостоятельно. Пункты 2 и 3 я себе представляю смутно(я бы даже сказал, очень смутно, от слова совсем). Подскажите как это делается, буду благодарен если подкинете пример) Код класса: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2016, 20:28 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont know, А чем первый пункт не устраивает, что так остро захотелось второй и третий? Вообще, по описанию, задача для JavaFX больше подходит. Он уже векторный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 08:41 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Т.е когда я скажем кручу колёсиком мыши, увеличивая масштаб, я должен увеличивать размер компонента, т.е. делать ему setSize(w*zoom, h*zoom), я вот и не знаю, по фен-шую ли это, стою на распутье? а то может это и не правильный способ и народ делает всё по другому, а у меня велосипед получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 11:44 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowи народ делает всё по другому, а у меня велосипед все по разному. В автокаде есть Модель, в которой есть класс Рисовалка, Масштаб, Стили и т.д. Рисуется всё без всяких компонентов. Но ты делай по простому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 11:50 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowТ.е когда я скажем кручу колёсиком мыши, увеличивая масштаб, я должен увеличивать размер компонента, т.е. делать ему setSize(w*zoom, h*zoom), я вот и не знаю, по фен-шую ли это, стою на распутье? а то может это и не правильный способ и народ делает всё по другому, а у меня велосипед получится. setSize и setPreferredSize очень разные. Всё упирается в LayoutManager. Для Java2D это по фен-шую. Там ничего такого нет. Для JavaFX - не думаю. Дам должна быть камера и много чего подобного. Но на 2D уровне я его не ковырял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:06 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Пример бы мне: форма, в неё лежит панелька, в которой что-либо нарисовано, крутим колёсиком - увеличивается масштаб и в соответствии с ним меняются размеры скроллбаром, так что можно прокручивать нарисованную картинку туда-сюда... много е понятней стало ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:22 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowв неё лежит панелька, в которой что-либо нарисовано нарисовано чем? Если рисовал сам типа 5,5, 100, 100 то нужно пересчитывать координаты на масштабе. Если это сцена FX то там Модель и приблуды для масштаба ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:30 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowПример бы мне: форма, в неё лежит панелька, в которой что-либо нарисовано, крутим колёсиком - увеличивается масштаб и в соответствии с ним меняются размеры скроллбаром, так что можно прокручивать нарисованную картинку туда-сюда... много е понятней стало ( Такой? http://stackoverflow.com/a/19646246 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:32 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Petro123, Обычным graphics2d. Ещё такой вопрос: вот я положил в JScrollPane свою панельку(холст, на которой рисую), затем в ходе "манипуляций", увеличил размер этой панельки, соответственно появились скролбары. Если я этим скролбаром немножко сдвину в сторону, скажем на 10 пикселей, правильно ли я понимаю, что взяв у Scrollpane.getView().getX() я получу как раз эти 10 пикселей, т.е отступ от края панели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:41 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ща попробую, кажется то что надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:42 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Пример как раз из той области что мне надо, только всплыла проблема с getPreferredSize(). В своей панели добавил: Код: java 1. 2. 3. 4. 5. 6. 7. И при сборке это дело зависло, зациклилось(Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError) на строке Dimension size = getPreferredSize(); рекурсивно вызывает до посинения ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 12:54 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont know Код: java 1. 2. 3. 4. 5. 6. 7. И при сборке это дело зависло, зациклилось(Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError) на строке Dimension size = getPreferredSize(); рекурсивно вызывает до посинения ( Блин, ну ты же сам так написал. Какого ты ожидал результата вызывая метод из самого себя? Не, ну можно, конечно super. влепить. Но это не то. Тебе нужен какой-то базовый размер, и где ты его будешь брать - твоя забота а не Swing. А Swing-у ты говоришь какой нужен Preferred Size в зависимости от масштаба. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:00 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Кажется понял, надо было вызывать super.getPreferredSize(). Сейчас скролбары появляются автоматически, только какие-то косяки с прорисовкой. Подвигаешь скролом и нарисованный прямоугольник не обновляется, хотя до него рисую деления(крест на экране) и они перерисовываются нормально. из-за чего так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:03 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowиз-за чего так? Из-за твоего кода. Начни с того что в Swing надо переопределять метод paintComponent(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:40 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Так оно и так переопределено Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:43 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); double width = getWidth(); double height = getHeight(); double zoomWidth = width * zoom; double zoomHeight = height * zoom; double anchorx = (width - zoomWidth) / 2; double anchory = (height - zoomHeight) / 2; AffineTransform at = new AffineTransform(); at.translate(anchorx, anchory); at.scale(zoom, zoom); at.translate(-100, -100); g2d.setTransform(at); g2d.drawImage(img, 0, 0, this); g2d.dispose(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:44 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
addMouseWheelListener(new MouseAdapter() { @Override public void mouseWheelMoved(MouseWheelEvent e) { if (e.getPreciseWheelRotation() < 0) { zoom -= 0.1; } else { zoom += 0.1; } // zoom += e.getPreciseWheelRotation(); if (zoom < 0.01) { zoom = 0.01; } repaint(); } }); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:47 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
arswars, У меня сейчас всё это дело выглядит вот так(отрисовка - примерно тоже самое что у вас, только пока без translate): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 13:55 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Я всё таки решил проблему с отрисовкой(не обновлялось изображение). Как выяснилось, это возникало из-за AffineTransform, по совету на каком-то англ. форуме, сделал так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. В связи с этим появилась пара вопросов: - Это вообще нормально, что в методе перерисовки постоянно создаётся новый объект(graphics2d)? - Нужно ли после использования удалять этот объект и как будет правильнее: dispose() или просто присвоить null? Кстати, по поводу использования оператора new(), смотрю примеры по java, как-то имхо часто он применяется, например в getPreferredSize() компонента, обязательно будет создаваться новый Dimension, это вообще нормально, что так часто используется оператор new(), расходуется память? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 09:41 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
I dont knowЯ всё таки решил проблему с отрисовкой(не обновлялось изображение). Как выяснилось, это возникало из-за AffineTransform, по совету на каком-то англ. форуме, сделал так: Я бы не рекомендовал подход "Фиг знает почему так, но работает" Ссылка есть? I dont knowВ связи с этим появилась пара вопросов: - Это вообще нормально, что в методе перерисовки постоянно создаётся новый объект(graphics2d)? - Нужно ли после использования удалять этот объект и как будет правильнее: dispose() или просто присвоить null? От присвоения null пользы вообще никакой не будет. Это действие на объект никак не влияет. I dont knowКстати, по поводу использования оператора new(), смотрю примеры по java, как-то имхо часто он применяется, например в getPreferredSize() компонента, обязательно будет создаваться новый Dimension, это вообще нормально, что так часто используется оператор new(), расходуется память? Это палка о двух концах. С одной стороны, да, Java, в целом, любит пожрать память. С другой стороны производительность GC от количества мусора страдает не сильно. И сам GC через поколения оптимизирован так, чтобы короткоживущие объекты собирались быстро и легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 09:54 |
|
||
|
[Graphics2D] как организовать скролинг холста?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Насколько помню вот тут: http://www.coderanch.com/t/461376/GUI/java/Resetting-AffineTransforms. Использование копии Graphics2D было связано с тем, что необходимо было сбрасывать матрицу преобразований после зума, т.к g2d.setTransform(AffineTransform at) не всегда работал корректно(оставляя следы от нарисованного при прокрутке), но сегодня с g2d.transform(at) работает вроде нормально: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 11:01 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39154430&tid=2124417]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 367ms |

| 0 / 0 |
