質問するログイン新規登録

回答編集履歴

1

追記

2017/05/10 20:24

投稿

umyu
umyu

スコア5846

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箇所drawLineを行っていますが
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();を呼び出してください。