回答編集履歴

1

追記

2017/05/10 20:24

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -84,6 +84,8 @@
84
84
 
85
85
  super.paintComponent(g);
86
86
 
87
+ // BufferedImageを再度作成。
88
+
87
89
  seve_field = new BufferedImage(600, 600, BufferedImage.TYPE_4BYTE_ABGR);
88
90
 
89
91
  // インスタンス変数 seveへの代入は下記行で行っているので、省略
@@ -158,7 +160,7 @@
158
160
 
159
161
  2点目、オフスクリーンメモリの扱いと描画順序について
160
162
 
161
- event#paintComponentメソッド内でseve2.drawLine、g2.drawLineと2箇所drawLineを行っていますが
163
+ event#paintComponentメソッド内でseve2.drawLine、g2.drawLineとJPanelとメモリの2箇所に対してdrawLineを行っていますが
162
164
 
163
165
  0. オフスクリーン(seve_field)にdrawLine
164
166
 
@@ -177,3 +179,21 @@
177
179
  4点目、あるコンポーネントのペイント領域を知りたい時は[SwingUtilities#calculateInnerArea](https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingUtilities.html)が使用できます。
178
180
 
179
181
  自分でオフスクーンを管理する時はJFrame(mainクラス)のウィンドウのサイズ変更イベントを契機にしてオフスクーンのサイズをコンポーネントのペイント領域と一致させる必要があります。面倒ならmainクラスのコンストラクタでthis.setResizable(false);を設定し、ウィンドウサイズを変更不可にしてください。
182
+
183
+
184
+
185
+ 5点目、インスタンス変数seve について。
186
+
187
+ インスタンス変数に代入箇所が2箇所あります、
188
+
189
+ 0. Graphics seve = seve_field.createGraphics();
190
+
191
+ 0. event#paintComponentメソッド内
192
+
193
+
194
+
195
+ Graphics には[disposeメソッド](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Graphics.html#dispose--)があるため
196
+
197
+ 使い終わったらseve.dispose();を呼び出してください。
198
+
199
+