回答編集履歴
1
追記
answer
CHANGED
@@ -41,6 +41,7 @@
|
|
41
41
|
System.out.println("ifルート");//確認用
|
42
42
|
flag = false;//戻し
|
43
43
|
super.paintComponent(g);
|
44
|
+
// BufferedImageを再度作成。
|
44
45
|
seve_field = new BufferedImage(600, 600, BufferedImage.TYPE_4BYTE_ABGR);
|
45
46
|
// インスタンス変数 seveへの代入は下記行で行っているので、省略
|
46
47
|
return;
|
@@ -78,7 +79,7 @@
|
|
78
79
|
```
|
79
80
|
|
80
81
|
2点目、オフスクリーンメモリの扱いと描画順序について
|
81
|
-
event#paintComponentメソッド内でseve2.drawLine、g2.drawLineと2箇所
|
82
|
+
event#paintComponentメソッド内でseve2.drawLine、g2.drawLineとJPanelとメモリの2箇所に対してdrawLineを行っていますが
|
82
83
|
0. オフスクリーン(seve_field)にdrawLine
|
83
84
|
0. オフスクリーンをevent#paintComponent関数で渡されたGraphicsに対してg.drawImage
|
84
85
|
オフスクリーンを使う目的から勝手に想像すると、こーなると思うのですが。
|
@@ -87,4 +88,12 @@
|
|
87
88
|
座標を扱う時は[java.awt.Point](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Point.html)、[java.awt.Rectangle](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Rectangle.html)を使うと管理しやすくなります。
|
88
89
|
|
89
90
|
4点目、あるコンポーネントのペイント領域を知りたい時は[SwingUtilities#calculateInnerArea](https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingUtilities.html)が使用できます。
|
90
|
-
自分でオフスクーンを管理する時はJFrame(mainクラス)のウィンドウのサイズ変更イベントを契機にしてオフスクーンのサイズをコンポーネントのペイント領域と一致させる必要があります。面倒ならmainクラスのコンストラクタでthis.setResizable(false);を設定し、ウィンドウサイズを変更不可にしてください。
|
91
|
+
自分でオフスクーンを管理する時はJFrame(mainクラス)のウィンドウのサイズ変更イベントを契機にしてオフスクーンのサイズをコンポーネントのペイント領域と一致させる必要があります。面倒ならmainクラスのコンストラクタでthis.setResizable(false);を設定し、ウィンドウサイズを変更不可にしてください。
|
92
|
+
|
93
|
+
5点目、インスタンス変数seve について。
|
94
|
+
インスタンス変数に代入箇所が2箇所あります、
|
95
|
+
0. Graphics seve = seve_field.createGraphics();
|
96
|
+
0. event#paintComponentメソッド内
|
97
|
+
|
98
|
+
Graphics には[disposeメソッド](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Graphics.html#dispose--)があるため
|
99
|
+
使い終わったらseve.dispose();を呼び出してください。
|