Javaでゲームプログラミングをしており、JPanelに画像や図形を描画することでゲームの内容を表示しています。
あるシーンにおいて数字の入力を受け付けるために、そのパネルにJTextFieldのコンポーネントを貼り付けました。
しかし、ダブルバッファリングを用いて再描画を行なっているので、その際の画面消去のせいか入力欄が表示されません。
貼り付けた位置をクリックして文字を入力すると、イベントの発火によってコンポーネントそのものが再描画されるためか、それ以降は入力欄がちらついて表示されるようになります。おそらく画面とコンポーネントがバラバラに再描画されているためだと思います。
そこで、コンポーネントの表示を画面の再描画と合わせて行えるようにしたいです。
今のところ、裏画面にコンポーネントを描画する方法を考えています。そうすれば、再描画でコンポーネントも同時に表示されると思います。
実際のプログラムは長すぎるので、サンプルを記載します。
Java
1public class Game extends JPanel implements Runnable { 2 3 public static final int WIDTH = 500; // 画面の幅 4 public static final int HEIGHT = 500; // 画面の高さ 5 6 private JTextField num = new JTextField("入力欄"); 7 8 // メインメソッドから呼び出されるコンストラクタ 9 public Game() { 10 11 setPreferredSize(new Dimension(WIDTH, HEIGHT)); 12 setFocusable(true); 13 setLayout(null); 14 15 // 入力欄の位置とサイズを設定 16 num.setBounds(250, 250, 100, 50); 17 18 // パネルに入力欄を貼り付け 19 add(num); 20 21 // ゲームループを起動 22 new Thread(this).start(); 23 } 24 25 // ゲームループ 26 public void run() { 27 28 while (true) { 29 30 try { 31 32 // 入力 33 input(); 34 35 // 更新 36 update(); 37 38 // 描画 39 draw(); 40 41 Thread.sleep(20); 42 43 } catch (InterruptedException e) { 44 e.printStackTrace(); 45 } 46 } 47 } 48 49 public void input() { 50 // 省略 51 } 52 53 public void update() { 54 // 省略 55 } 56 57 public void draw() { 58 59 if (buffer == null) { 60 61 // 裏画面を作成 62 buffer = createImage(WIDTH, HEIGHT); 63 64 if (buffer == null) 65 return; 66 else 67 context = buffer.getGraphics(); // 裏画面のグラフィックコンテキストを取得 68 } 69 70 // 画面消去 71 context.setColor(Color.WHITE); 72 context.fillRect(0, 0, WIDTH, HEIGHT); 73 74 // 裏画面に描画 ---------- 75 player.draw(context); 76 ball.draw(context); 77 // --------------------- 78 79 try { 80 81 // 表画面のグラフィックコンテキストを取得 82 Graphics g = getGraphics(); 83 84 // 裏画面を表画面に転送 85 if (g != null && buffer != null) 86 g.drawImage(buffer, 0, 0, null); 87 88 Toolkit.getDefaultToolkit().sync(); 89 90 if (g != null) 91 g.dispose(); 92 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } 96 } 97}
なお、裏画面に描画を行う箇所で以下のコードを挿入すると、ちらついて表示される入力欄とは別に画面の左上の隅に入力欄が表示されます。
ちらつく入力欄の内容と常に一致しており、こちらはダブルバッファリングが効いているためか綺麗に表示されます。
裏画面の原点から描画されているようなので、できればこの表示の位置を調整したいです。
Java
1num.print(context);
なお、コンポーネントを裏画面に描画する以外に良い方法があるなら是非教えていただきたく思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/15 01:09 編集
2019/12/15 03:10
2019/12/15 04:29 編集
2019/12/15 05:59 編集
2019/12/15 07:06
2019/12/15 10:06 編集
2019/12/15 10:13