質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2448閲覧

repaintの処理

nakamura-

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/06/27 02:21

コード public class MyPanel extends JPanel{ Player player1; int gun_x = -100; int gun_y = -100; /** * MyPanelのコンストラクタ */ public MyPanel(){ setBackground(Color.BLACK); //背景色設定 try{ player1 = new Player("jiki.gif", 0, 0, 32, 32); } catch(IOException ioe){ System.out.println("画像がありません"); } } /** * キー入力処理 */ protected void processKeyEvent(KeyEvent ke){ /*何かキーが押された場合*/ if(ke.getID() == KeyEvent.KEY_PRESSED){ System.out.println("キー" + ke.getKeyCode() + "が押された"); player1.move1(ke.getKeyCode()); move2(ke.getKeyCode()); repaint(); } } /** * 描画メソッド */ protected void paintComponent(Graphics g){ super.paintComponent(g); requestFocusInWindow(); //キー入力有効化 player1.draw1(g); draw2(g); } /** * */ public void draw2(Graphics g){ g.setColor(Color.WHITE); g.fillRect(gun_x, gun_y, 5, 5); } /** * */ public void move2(int keyCode){ if(keyCode == KeyEvent.VK_ENTER){ gun_x = player1.m_x; gun_y = player1.m_y; Thread thread = new Thread(new Runnable(){ public void run(){ for(int i = 0; i < 50; i++){ try{ Thread.sleep(50); } catch(InterruptedException e){ } gun_y -= 10; repaint(); } } }); thread.start(); } } }

これはプログラムの一部です。
今このプログラムでは、ENTERキーを押すと、0.05秒ごとにy座標が10ずつ動く四角形を描画しています。
このmove2メソッドを下のように別クラスに移したいのですが、

コード public class Gun{ int gun_x = -100; int gun_y = -100; /** * */ public void move2(int keyCode){ if(keyCode == KeyEvent.VK_ENTER){ gun_x = player1.m_x; gun_y = player1.m_y; Thread thread = new Thread(new Runnable(){ public void run(){ for(int i = 0; i < 50; i++){ try{ Thread.sleep(50); } catch(InterruptedException e){ } gun_y -= 10; repaint(); } } }); thread.start(); } } }

このときrepaint();でエラーが出てしまいます。
MyPanelクラスにあったときと違ってGunクラスはJPanelを継承していないからだと思うのですがよくわかりませんでした。
repaintはどう対処したらいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いくつか対処方法はありますが、
方法1.インナークラスで実施する
MyPanel クラスの中にインナークラスを作成する

private class Gun { public void move2(int keyCode){ ~~ } }

方法2.GunクラスのMoive2メソッドの引数にMyPanelを渡す

public void move2(int keyCode, MyPanel panel){ ~~ panel.repaint(); }

もし自分なら方法1のほうを実装すると思います。

本件とは関係ないので簡単に気になる点を挙げます。
・キーを連打した場合に速度がおかしくなると思います。
(スレッドの無駄な生成が発生する。)

投稿2016/06/27 04:39

Yossi_1982

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/06/27 04:53

回答ありがとうございます。 参考にしてどちらもやってみたいと思います! 確かに連打したとき速度がおかしくなりました。 ENTERキーを押すたびにスレッドが生成されてしまうからおかしくなるということでしょうか?
Yossi_1982

2016/06/27 04:59 編集

そういうことです。 スレッドが複数本立ち、gun_y -= 10が不必要に計算されているからです。 この辺はGoogleなどで「Java 再描画 無限ループ」などのキーワードで探してみると色々と対処方法が書いてあるページがあるので参考にしてみてください。
nakamura-

2016/06/27 07:40

ご指摘ありがとうございました。 調べてみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問