ウインドウを大きくしてもボールの動きが変わらない

このQ&Aのポイント
  • ComponentListenerを使用してウインドウをリサイズしても、ボールの動きには反映されない
  • componentResizedではリサイズされたウインドウの大きさを取得できるが、ボールの動きには反映されていない
  • ウインドウの大きさが変わっても、ボールの移動範囲は変わらない
回答を見る
  • ベストアンサー

ウインドウを大きくしてもボールの動きが変わらない

 今晩は、java初心者です。  宜しくお願い致します。  "ComponentListener"でウインドウを"componentResized"してもボールの動く範囲 は変わりません、何故でしょうか。    "componentResized"では確かに"Resized"されたウインドウの大きさをとっていますが、 何故かボールの動きには反映されません。  宜しくお願いします。 ======================================================================================== public class Ball2 extends Applet implements Runnable , ComponentListener { public static final long serialVersionUID = 1L ; int width , height ; Thread thread ; boolean  LoopFlag = false  ; int x = 30 , y = 100 ; Image  offScreen ; Graphics screen ; int vx = 2 , vy = 2 ; public void init() { width = getSize().width ; height = getSize().height ; thread = new Thread( this ); thread.start(); offScreen = createImage( width, height ) ; screen = offScreen.getGraphics() ; addComponentListener(this) ; } public void componentResized( ComponentEvent e ) { width = getSize().width ; height = getSize().height ; } public void run() { while( LoopFlag == false ) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } private void move() { if( x >= width - 50 ) { vx =- vx ; } if( y >= height - 50 ) { vy =- vy ; } if( x < 0 ) { vx =- vx ; } if( y < 0 ) { vy =-vy ; } x += vx; y += vy; } public void update( Graphics g) { paint(g) ; } public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; screen.setColor( Color.blue ) ; screen.fillOval( x , y , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; } public void destroy() { LoopFlag = true ; } public void componentHidden( ComponentEvent e ){} public void componentMoved( ComponentEvent e ){} public void componentShown( ComponentEvent e ){} }

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

非常によく似たプログラムをQNo.7752653でも見たような。 試してみましたが、appletviewerで実行すればボールの動く範囲はウィンドウのリサイズに合わせてちゃんと変わりますよ。 いくつか問題はありますが。 ・オフスクリーンバッファ(変数offScreenおよびscreen)の大きさが変わらないので、ウィンドウを大きくしたときに描画されない部分が出る ・ウィンドウを小さくしたときにボールが外に出てしまうとおかしくなる(ボールがはみ出さないようにウィンドウを縮小する場合は大丈夫) ウェブブラウザ内で実行する場合はブラウザのウィンドウの大きさとアプレットの大きさが連動しないのはANo.1に書かれているとおり。

その他の回答 (1)

noname#177743
noname#177743
回答No.1

ComponentListenerは、コンポーネントの大きさが変更された時のイベントです。つまり、アプレット自身のサイズが変更された時にイベントが発生するわけです。 ブラウザのウインドウを変更しても、アプレットのサイズは変わりません。アプレットは、最初に初期化された時に大きさが設定され、後でサイズを変更することはできなかったはずですので、このイベント処理は無意味でしょう。 アプレットのイベントは、Webブラウザの動作とは一切無関係で、アプレット内部の動作のためのものです。この2つがごっちゃにならないように。

westwest_2007
質問者

お礼

chiiba_kunさん、回答有難うございます。  初心者なので確かによくその辺のところが理解出来ていません。  具体的にはどのように書いてやればいいのでしょうか。  宜しくお願いします。

関連するQ&A

  • 画面の大きさに合わせてボールを動かせたい

    今日は。 javaの初心者です、宜しくお願いします。 下のようなボールが動くアプレットを組んでみましたが、画面の大きさを変えても ボールの動く範囲はかわりません。 画面の大きさに合わせて、動く範囲を自動的に変えてやるには、このプログラムの 何処をどのように書き換えてやるといいのでしょうか。  宜しくお願いします。 ========================================================================== import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; public class BallMove_1p extends Applet implements Runnable { private int width , height ; private Thread thread ; private boolean LoopEnd = false ; private int x1 = 30 , y1 = 100 ; private Image offScreen ; private Graphics screen ; private int vx = 2 , vy = 2 ; // アプレット初期化処理 public void init() { // アプレット画面サイズ取得 width = getSize().width ; height = getSize().height ; // スレッド起動 thread = new Thread( this); thread.start(); // オフスクリーンの初期化 offScreen = createImage( width, height); // オフスクリーンを作成 screen = offScreen.getGraphics(); // オブジェクトを取得 } // スレッドループ処理 public void run() { while(LoopEnd == false) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } // ボール移動 private void move() { if( x1 >= width - 50 ) { vx =- vx ; } if( y1 >= height - 50 ) { vy =-vy ; } if( x1 < 0 ) { vx =- vx ; } if( y1 < 0 ) { vy =-vy ; } x1 += vx; y1 += vy; } // 再描画時処理 public void update( Graphics g) { paint(g) ; } // 描画処理 public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; // 画面消去 screen.setColor( Color.blue ) ; screen.fillOval( x1 , y1 , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; // イメージを描画 } // アプレット終了時処理 public void destroy() { LoopEnd = true ; } }

    • ベストアンサー
    • Java
  • マウスクリックで別のスレッドを動かしたい

    うまく動きません、どなたかご教示下さい(文字数が不足です) ===== public class ImgMove3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th1 /*, th2*/ ; private boolean bLoopEnd = false ; private int x1 = 30 , y1 = 100 ; // private int x2 = 80 , y2 = 150 ; Image img1 , img2 ; AudioClip sound ; private int vx1 = 3 , vy1 = 2 ; // private int vx2 = 1 , vy2 = 1 ; Dimension d ; public void init() { d = getSize() ; width = d.width ; height = d.height ; this.addMouseListener(this) ; this.addMouseListener(new MyImage3(this)) ; img1 = getImage( getDocumentBase() , "ambulance.jpg" ) ; img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; sound = getAudioClip( getDocumentBase() , "UFO.wav" ) ; } public void mouseEntered( MouseEvent e) { sound.play() ; } public void mouseClicked(MouseEvent e) { } public void start() { if(th1 == null) { th1 = new Thread(this); th1.start(); } } public void stop() { if( th1 != null ) { th1 = null ; } } public void run() { while(bLoopEnd == false) { move() ; repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x1 >= width - 130 ) { vx1 =- vx1 ; } if( y1 >= height - 110 ) { vy1 =- vy1 ; } if( x1 < 0 ) { vx1 =- vx1 ; } if( y1 < 0 ) { vy1 =- vy1 ; } } public void update( Graphics g1 ) { paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img1 , x1 , y1 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e){ } } //======================================================================= class MyImage3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th2 ; private boolean bLoopEnd = false ; private int x2 = 80 , y2 = 150 ; Image img2 ; AudioClip sound ; private int vx2 = 1 , vy2 = 1 ; Dimension d ; Image firecar ; ImgMove3 imv3 ; public MyImage3(ImgMove3 app) { imv3 = app ; imv3.img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; } public void mouseEntered( MouseEvent e) { imv3.sound.play() ; } public void mouseClicked(MouseEvent e) { Graphics g1 =getGraphics(); g1.drawImage( img2 , x2 , y2 , this ) ; imv3.repaint(); } public void start() { if(th2 == null) { th2 = new Thread(this); th2.start(); } } public void stop() { if( th2 != null ) { th2 = null ; } } public void run() { while( th2 != null && bLoopEnd == false) { move() ; imv3.repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x2 >= width - 130 ) { vx2 =- vx2 ; } if( y2 >= height - 110 ) { vy2 =- vy2 ; } if( x2 < 0 ) { vx2 =- vx2 ; } if( y2 < 0 ) { vy2 =- vy2 ; } x2 += vx2 ; y2 += vy2 ; } public void update( Graphics g1 ) { imv3.paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img2 , x2 , y2 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }

    • ベストアンサー
    • Java
  • Appletのrepaint()が動作しません

    import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

  • ボールが勝手に動き困ってます。

    前回にひき続き困ってます>< タイトル画面→(Enterクリック)→ゲーム画面までできたんですが ゲーム画面でボールとタイマーを動かしたくてやってみるとタイマーはうまく いったのにボールが動く速度を変更できず、勝手に動いてしまいます><どう 改善すればいいでしょうか。ソースコードみにくいですが助言お願いします。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class JavaGame3 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("ゲームフレーム"); frame.setSize(500, 550); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Testpanel panel = new Testpanel(); frame.add(panel); frame.setVisible(true); } } class Testpanel extends JPanel implements Runnable{ private Ball[] balls; static final int TITLE = 0; static final int GAME = 1; private int mode; private int sec; private Timer timer; private Thread t; public Testpanel() { balls = new Ball[5]; java.util.Random rr = new java.util.Random(); for(int i=0; i<balls.length; i++) balls[i] = new Ball(10*i+6,10*i+31,rr.nextInt(5)+1, rr.nextInt(5)+1); sec = 0; setBackground(Color.black); addKeyListener(new JavaKeyListener()); setFocusable(true); timer = new Timer(1000, new JavaActionListener()); mode = TITLE; t = new Thread(this); } class JavaActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (sec == 30) { timer.stop(); } else { sec++; } } } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("タイトル", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } public void drawGameOver(Graphics g) { g.setColor(Color.white); g.setColor(Color.red); g.drawString(sec + "sec", 230, 300); repaint(); for (int i=0; i<balls.length; i++) balls[i].draw(g); } protected void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } class JavaKeyListener implements KeyListener { public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; timer.start(); t.start(); sec = 0; break;} } else { switch (key) { case KeyEvent.VK_ENTER: mode = TITLE; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } public void run() { while(true) { try { Thread.sleep(100); } catch (Exception e) {} repaint(); } } } class Ball { private int x, y, vx, vy, r; public Ball(int x, int y, int vx, int vy) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; r = 30; } public void draw(Graphics g) { g.fillOval(x, y, r, r); x += vx; y += vy; if(x < 0 || x > 457) vx = -vx; if(y < 0 || y > 433) vy = -vy; } }

    • ベストアンサー
    • Java
  • Java ボールが動くアニメーション

    ボールがウインドウ内を跳ねるプログラムを作っているのですが、ある所でフリーズしてしまいました。 class BallBound implements ActionListener { BallBound() { //ウインドウ作成・アクションリスナ登録・メニューバー作成&取り付けなど } //アニメーション public void byoga() { boolean xvect = true, yvect = true; loop = true; //グローバル変数 while (loop) { repaint(); try { Thread.sleep(10); } catch (InterruptedException e1) { } if (x <= 0 || x+vx >= frame.getWidth()) { xvect = !xvect; } //はみ出たら逆ベクトルへ if (y <= 0 || y+vy >= frame.getHeight()) { yvect = !yvect; } if (xvect) x += xch; else x -= xch; if (yvect) y += ych; else y -= ych; } } public void actionPerformed(ActionEvent e) { if(e.getSource() == start) { if(loop == false) { byoga(); } } if(e.getSource() == stop) { loop = false; } } protected void paintComponent(Graphics g) { g.fillOval(x, y, vx, vy); } } という風にactionPerformed()から、JMenuItem startが押された場合にbyoga()を呼び出しているのですが、startのメニューを押した(選んだ)瞬間にフリーズしてしまってタスクマネージャから強制終了せざるを得ない状態になってしまいます。 しかしコンストラクタの末尾からbyoga()を呼び出してみたりmain()から呼び出したりした場合はフリーズせずに起動できます。 これは一体何故なんでしょうか・・・? どなたか教えてほしいです・・・

    • ベストアンサー
    • Java
  • エラーも無いのにボールが動きません

     JAVA初心者です、宜しくお願いします。  今晩は、以下のようなコードを書いてやりましたが、動きません。  何故でしょう、特にエラーははいていません。  原因が分かりません、宜しくお願いします。 =============================================================== public class Ball_1 extends Applet implements Runnable { Thread thr = null; Color BGcolor; int appWidth; int appHeight; int x; int vel; public void inti() { BGcolor = Color.white; appWidth = 400; appHeight = 400; x = 30; vel = 20; } public void paint(Graphics g) { g.setColor(BGcolor); g.fillRect(0,0,appWidth,appHeight); g.setColor(Color.blue); g.fillOval(x,20,100,100); } public void start() { if(thr == null) { thr = new Thread(this); thr.start(); } } public void stop() { if(thr != null) { thr.stop(); thr = null; } } public void run() { while(true) { x = x + vel; if(x > appWidth) { x = x - appWidth; } repaint(); try { thr.sleep(50); } catch(InterruptedException e) { thr.stop(); } } } }

    • ベストアンサー
    • Java
  • 初心者です。 コンパイルのエラー

    import java.awt.*; import javax.swing.*; public class R11Sample1 extends JFrame { Rect r1 = new Rect(Color.red, 100, 100, 80, 60); Rect r2 = new Rect(new Color (0.5f, 1f, 0f, 0.7f), 150, 120, 60, 90); Oval = new Oval(Color.blue, 60, 50, 10, 10); JPanel panel = new JPanel() { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; r1.draw(g2); r2.draw(g2); } }; public R11Sample1() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(panel); } public static void main(String[] args) { new R11Sample1().setVisible (true); } } class Rect { Paint pat; int xpos, ypos, width, height; public Rect(Paint p, int x, int y, int w, int h) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillRect(xpos-width/2, ypos-height/2, width, height); } } class Oval { Paint pat; int xpos, ypos, radius; public Oval(Paint p, int x, int y, int width, int height) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillOval(xpos-width/2, ypos-height/2, width, height); } } これでコンパイルすると、 Identifierがありません といわれました。 どこを直せばいいのでしょうか。 また、全体的に間違ったところがあったら教えてください。

    • ベストアンサー
    • Java
  • f(x)=xのf'(x)と∫f(x)dxのグラフ化

    f(x)=xのf'(x)と∫f(x)dxのグラフ化したいのですがここからどうすればいいのか分からず足踏みしてます。ご教授ください。 積分区間は0~xです。 import java.awt.*; import java.awt.event.*; public class graphics0 extends Frame { // コンストラクタ public graphics0(){ setSize(500, 500); setVisible(true); setTitle("graphics0"); // メッセージ処理 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } // メインメソッド public static void main(String[] args){ new graphics0(); } // ペイントメソッド public void paint(Graphics g){ //ここに絵をかくコードを書く // 中心座標 int ox = 250; int oy = 250; // グラフの幅 int width = 200; int height = 200; //直線描画のための2点(x0,y0), (x1, y1) double x0, y0; double x1, y1; // 刻み幅 double d = 0.001; double n = (int) (1.0 / d); // 軸の描画 g.drawLine(50, 250, 450, 250); g.drawLine(250, 50, 250, 450); x0 = 0; y0 = 0; x1 = d; for(int i = 0; i < n; i++){ y1 = x1 * x1; g.drawLine( (int) (x0 * width) + ox, -((int)(y0 * height) -oy), (int) (x1 * width) + ox, -((int) (y1 * height) - oy)); x0 += d; x1 += d; y0 = y1; } } } よろしくお願いいたします。

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • java ダブルバッファリングするがちらつく

    javaでゲームをつくろうかと考えています。 そこで、ダブルバッファリングを実装したのですが、ちらついてしまいます。 いろいろ検索をかけて調べたのですが、これ以上改善が見込めないので 質問します。 以下がソースコードです。 画面がちらつくので、画面のリフレッシュレートが関係しているのかわからず、 しかし、ふつうにjava applet でゲームがあるので、多分どこかが間違っていると思います。 ご指摘をお願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.net.URL; /*<applet code="applet01" width="320" height="480"></applet>*/ public class applet01 extends Applet implements KeyListener, Runnable { String text = ""; Image image; int x = 100, y = 100; KeyInput key; Image image弾; Bullet bullet; int flag_x = 1; Image backbuffer; Graphics ct; Dimension dim; // 初期化 public void init() { // image = getImage( getDocumentBase(), "test.jpg" ); image = getImage( getCodeBase(), "test.jpg" ); image弾 = getImage( getCodeBase(), "弾.jpg" ); bullet = new Bullet(); key = new KeyInput(); dim = getSize(); backbuffer = createImage( dim.width, dim.height ); ct = backbuffer.getGraphics(); Thread th = new Thread( this ); th.start(); addKeyListener( this ); requestFocus(); } // public void run() { try { while(true) { repaint(); Thread.sleep(1000/60); if( x>640 ) flag_x = 1; if( x<0 ) flag_x = 0; if( 1 == flag_x ) x--; if( 0 == flag_x ) x++; } } catch( Exception err ) { } } // 描画 public void paint( Graphics g ) { ct.setColor( Color.white ); ct.fillRect( 0, 0, dim.width, dim.height ); ct.setColor( Color.red ); ct.fillRect( (dim.width/2)-50 , (dim.height/2)-50, x, y ); // 裏画面に描画 ct.drawString( "画面をクリックしてキーボードで操作できます。", 0, 20 ); ct.drawString( "Hello from Java!", 60, 100 ); ct.drawImage( image, x, y, this ); bullet.Draw( ct, this, image弾 ); // 裏画面を表に反映 g.drawImage( backbuffer, 0, 0, this ); } // キーの入力があったとき public void keyTyped( KeyEvent e ) { repaint(); } // キーが押されたとき public void keyPressed( KeyEvent e ) { key.keyPressed( e ); if( key.isPressing( KeyEvent.VK_UP ) ) y = y - 5; if( key.isPressing( KeyEvent.VK_DOWN ) ) y = y + 5; if( key.isPressing( KeyEvent.VK_LEFT ) ) x = x - 5; if( key.isPressing( KeyEvent.VK_RIGHT ) ) x = x + 5; if( KeyEvent.VK_UP == e.getKeyCode() ) y = y - 5; if( KeyEvent.VK_Z == e.getKeyCode() ) { bullet.x = x; bullet.y = y; } repaint(); } // キーが放されたとき public void keyReleased( KeyEvent e ) { key.keyReleased( e ); } }

    • ベストアンサー
    • Java

専門家に質問してみよう