Javaのrepaint()に関するデバッグができない理由とは?
- Javaのrepaint()メソッドに関して、プログラム内のpaintComponentメソッドのデバッグができない理由を教えてください。
- MainPanelクラスのpaintComponentメソッド内のデバッグについて、どうしてデバッグができないのか説明してください。
- Javaのrepaint()メソッドにおいて、paintComponentメソッドのデバッグができない理由について詳しく教えてください。
- ベストアンサー
java repaint()に関して
プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }
- tajitaji323
- お礼率40% (4/10)
- Java
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
下記のプログラムで確認しましたが、メッセージは表示されているようです。 補足の情報があればお願いいたします。 ----------------------------------- class MyWin extends JFrame{ MainPanel pnl; MyWin(){ setSize(200, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); pnl = new MainPanel(); add(pnl, BorderLayout.CENTER); pnl.movestart(); } public static void main(String args[]){ MyWin win = new MyWin(); win.setVisible(true); } } -----------------------------------
関連するQ&A
- javaのJPanel重ね時、repaint
JPanelの上にJPanelを重ね、上のJPanelを透過させました。 この状態で両方のパネルでstartを行います。 下記の結果では、両方が動いています。 目標として、片方のパネルが描写をのこし、片方のパネルが再描写するのが理想です。 誰かお教えください。 import javax.swing.JFrame; import java.awt.*; public class Test extends Object { public static void main(String[] arguments){ TestViewU Upanel = new TestViewU();//上のパネル TestViewS Spanel = new TestViewS();//下のパネル Upanel.setLocation(new Point(0, 0)); Upanel.setLayout(null); Upanel.setOpaque(false); Spanel.setLocation(new Point(0, 0)); Spanel.setLayout(null); Spanel.add(Upanel); Upanel.setSize(new Dimension(800, 600)); Spanel.setSize(new Dimension(800, 600)); JFrame aWindow; aWindow = new JFrame("MVC-"); aWindow.getContentPane().add(Spanel); aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); aWindow.setSize(800, 600); aWindow.setVisible(true); Spanel.start(); Upanel.start(); } } import java.awt.*; import javax.swing.*; public class TestViewS extends JPanel implements Runnable{ static Thread thread; private static int interval_time = 5; int a = 100; int b = 100; public TestViewS(){ setBackground(Color.WHITE); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.BLUE); g.fillRect(a, b, 10, 10); } void start() { thread = new Thread(this); thread.start(); } public void run() { boolean checkA = true; boolean checkB = true; Thread thisThread = Thread.currentThread(); while (thisThread == thread) { try { if(checkA && checkB){ a++;} else if(!checkA && checkB){ b++;} else if(!checkA && !checkB){ a--;} else if(checkA && !checkB){ b--;} if(a == 701){ checkA = !checkA; a--;} else if(a == 99){ checkA = !checkA; a++;} if(b == 501){ checkB = !checkB; b--;} else if(b == 99){ checkB = !checkB; b++;} repaint(); Thread.sleep(interval_time); } catch (InterruptedException ie) { thread = null; break;}} } } import java.awt.*; import javax.swing.*; public class TestViewU extends JPanel implements Runnable{ static Thread thread; private static int interval_time = 5; int a = 200; int b = 200; public TestViewU(){ } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.RED); g.fillRect(a, b, 10, 10); } void start() { thread = new Thread(this); thread.start(); } public void run() { boolean checkA = true; boolean checkB = true; Thread thisThread = Thread.currentThread(); while (thisThread == thread) { try { if(checkA && checkB){ a++;} else if(!checkA && checkB){ b++;} else if(!checkA && !checkB){ a--;} else if(checkA && !checkB){ b--;} if(a == 601){ checkA = !checkA; a--;} else if(a == 199){ checkA = !checkA; a++;} if(b == 401){ checkB = !checkB; b--;} else if(b == 199){ checkB = !checkB; b++;} repaint(a, b, 10, 10); Thread.sleep(interval_time); } catch (InterruptedException ie) { thread = null; break;}} } }
- 締切済み
- Java
- [javaプログラムについて] うまく動きません。
import java.*; class Test { void main() { Th th1 = new Th("01スレッド"); Th th2 = new Th("02スレッド"); th1.start(); th2.start(); } } class Th extends Thread { void run(String pri) { for (int i=0;i<5;i++) { System.out.println(pri + " : " + i); } } } スレッドの使い方がいまいちよく分かりません。 どこが間違っているのか教えてください。 宜しくお願い致します。
- ベストアンサー
- Java
- (長文です。すみません。)repaintをコードに書いてもupdateが実行されなくて困ってます。
わざわざ見て下さってありがとうございます! マルチスレッドのアプレットを作っています。全部書くと多すぎるので、およそのものを書きました。 ●●●●プログラム本体開始●●●● public class RPG extends Applet implements Runnable ,KeyListener { 「いくつかのフィールド」 public void init(){ 「中略」 RPG hero = new RPG(); Thread heroStep = new Thread(hero); heroStep.start(); addKeyListener(this); } public void run(){ while(true){ try{ Thread.sleep(300); } catch(Exception e){} System.out.println("リペイント直前") repaint(); System.out.println("リペイント通過"); } } public void update(Graphics g){ System.out.println("アップデイト実行"); paint(g); } public synchronized void paint(Graphics g){ System.out.println("ペイント実行"); 「中略」 } public void keyPressed( KeyEvent e ){ 「中略」 repaint(); } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} } ●●●●プログラム本体終了●●●● うまく動かなくて困っています。repaintは、キー入力をした時と、0.3秒毎にheroStepから呼び出される事にしたいのです。キー入力の場合は確実に実行されているのですが、0.3秒毎の方は全然実行してくれないのです。 コンソールを見ると、 リペイント直前 リペイント通過 と、毎回「アップデイト実行」「ペイント実行」が出力されないのです。何がいけないのでしょうか? 万が一、大切な部分を省略していたり、不足の部分がございましたら、教えて頂ければ追加で掲載致します。 どうか宜しくお願い致します。
- ベストアンサー
- Java
- javaのrepaint()について
Java初心者です。 現在、アニメーションで少々つまずいています・・・ソースは以下の通りです。 import java.awt.*; import java.awt.event.*; public class test04 extends Frame implements KeyListener { public int x = 10, y = 10; public static void main(String[] args) { new test04(); } test04() { super("KeyFrameTest"); //フレーム名 setSize(200, 200); //フレームサイズを設定 MyCanvas mc = new MyCanvas(); mc.addKeyListener(this); add(mc); setVisible(true); //フレームを表示 addWindowListener(new Close()); //クローズ処理 } /*** キーが押されているとき ***/ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case 37: //← x--; break; case 38: //↑ y--; break; case 39: //→ x++; break; case 40: //↓ y++; break; } System.out.println("(" + x + "," + y + ")"); } /*** キーが離されたとき ***/ public void keyReleased(KeyEvent e) { } /*** キーが押された瞬間 ***/ public void keyTyped(KeyEvent e) { } /*** キャンバス用クラス ***/ class MyCanvas extends Canvas { /*** 描画ステータス ***/ public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 20, 20); repaint(); } /*** ペイント処理 ***/ //勝手に点滅するのを回避するため public void update(Graphics g) { paint(g); } } } /*** クローズクラス ***/ class Close extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } /*** スリープクラス ***/ class Sleep extends Thread { public void Sleep(long milli) { try { Thread.sleep(milli); } catch(Exception e) { } } } ↑のプログラムを実行すると、押したキーに対応する動作はするのですが、 前に描画した残像が残ってしまい、上手くいきません・・・repaint()の位置を変えてみたり したら、今度はボックスが動かなくなってしまい、訳が分からなくなって来ました・・・何故 上手くいかないんでしょうか? 理想的な動作としては、押したキーに対応した動作をし、残像も残らないようにしたいです。 ご回答よろしくお願いします。
- ベストアンサー
- Java
- Javaアプレットについてですが
Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }
- ベストアンサー
- Java
- Java applet
Java appletを使用する課題なのですが、 途中まで書いて、それから止まってしまっています。 アドバイスなど頂ければ嬉しいです。 課題は、 (1)右から左へ動く文字列左から右へ動く文字列とを表示 (2)文字列が消えたらまた出てくるようにする (3)マウスのクリックボタンを押すと止まり、離すと動きだすようにする (2)まで考えたプログラム(コンパイル、実行済)を以下に載せます。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class SasakiYui extends Applet implements Runnable{ Thread th = null; Graphics g; int x; public void init(){ setBackground(Color.white); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void run(){ while(!Thread.interrupted()){ for(x=600;x>-300;x=x-5){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){} } } } public void paint(Graphics g){ g.drawString("Happy Brithday!",x,10); g.drawString("Happy Birthday!",600-x,40); } } (3)ができるようにするには、 addMouseListener(new Mouseadapter(){ public void mousePressed(MouseEvent e){……} を使用するのだろうとは思うのですが、 ・これを組み込むのはpublic void init(){の後で良いか ・……の部分に何を書けばいいのか の2点がわかりません; よろしければ、アドバイスお願い致します!
- ベストアンサー
- Java
- repaint()が実行されません。
repaint()が実行されません。 もともとあるJEditorPane上に画像表示させるために、他のクラスからrepaint()をよびだしてpaint()を実行させようとしているのですが、実行されません……。 以下にプログラムを表示します。 import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Open extends JFrame { public Open(){ } public void paint(Graphics g){ System.out.println("paint開始"); Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("sample.png")); } catch (Exception e) { e.printStackTrace(); readImage = null; } if (readImage != null){ g2.drawImage(readImage, 0, 0, this); } } public void Fileload(){ System.out.println("再描写"); repaint(); } } 外部のクラスからFileload()を呼び出して実行すると"再描写"はコマンドプロンプト上に表示されるのですが"paint開始"は表示されません。なのでpaint()の呼び出しができていないのだと思うのですが……。 原因がわかりません……。 javaも質問も初心者なのでわかりづらいところがあるとは思いますが、どうぞよろしくお願いします。
- ベストアンサー
- Java
- Runnableのインスタンス化について
下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }
- ベストアンサー
- Java
- javaについて教えて下さい!
class SampleA implements Runnable { int tmp1 = 0; int tmp2 = 0; public synchronized void run(){ try{ if(tmp1 == 1){ System.out.print("は"); System.out.print("め"); else if (tmp1 == 2){ System.out.print("じ"); System.out.print("て"); } if(tmp2 == 0) tmp2 = tmp2 + 1; System.out.print("ま"); } System.out.print("。"); }catch(InterrupedException e){ System.out.print("し"); } } } //Sample2.java class Sample2{ public static void main(String[] args){ Sample1 sp = new Sample1(); Thread th1 = new Thread(sp); Thread th2 = new Thread(sp); th1.start(); th2.start(); } } wait(),notify(),throwを使って例外を生じさせるところまではわかったのですが このプログラムを「はじめまして。」と順番に出力するにはどうすればいいですか? プログラム内容は追記する形でお願いします。
- ベストアンサー
- Java
- Java言語のインタフェースについて
Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。
- ベストアンサー
- Java
お礼
どうやら他の部分から関数を呼び出すところでオブジェクトの引き渡しが上手くできていなかった事が原因用でした。 tekebonさんのご回答で、この部分が間違っていないことがわかったため判明したことです。 どうも、ありがとうございました!