ボタンを押すと決まった関数が呼び出されるようなプログラムを作っています。ですがSample.javaのvxup()やvxdown()など4つの間巣が反応しません。なぜなのかわからず教えていただきたいです。
//Sample.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Sample extends JPanel implements ActionListener{ static int xPanelSize; static int yPanelSize; double x,y,r,vx,vy,ax,ay; BallPropagator b1; Color c1; static JButton btn1 = new JButton("↑"); static JButton btn2 = new JButton("↓"); static JButton btn3 = new JButton("→"); static JButton btn4 = new JButton("←"); Sample(int xPanelSize, int yPanelSize){ this.xPanelSize = xPanelSize; this.yPanelSize = yPanelSize; b1 = new BallPropagator(10, 100, 100, 30, 40, 0, 9.8); btn1.addActionListener(this); btn1.setBounds(100,100,50,100); btn2.addActionListener(this); btn2.setBounds(100,50,50,100); btn3.addActionListener(this); btn3.setBounds(0,100,100,100); btn4.addActionListener(this); btn4.setBounds(200,100,100,100); } //イベント(タイマーによる呼び出し)が発生したときの処理 public void actionPerformed(ActionEvent e){ JButton selectedButton = (JButton)e.getSource(); if(selectedButton==btn1){ System.out.println("up"); b1.upvy(); }else if(selectedButton==btn2){ System.out.println("down"); b1.downvy(); }else if(selectedButton==btn3){ System.out.println("right"); b1.leftvx(); }else{ System.out.println("left"); b1.rightvx(); } } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(c1); g.fillOval((int)(b1.a(x) - b1.c(r)), (int)(b1.b(y) - b1.c(r)), (int)(2*b1.c(r)), (int)(2*b1.c(r))); } public static void main(String[] args) { BallMain panel = new BallMain(640,480); Sample sample=new Sample(640,480); BallPropagator.dt=0.1; BallPropagator.o=5.0; JFrame frame = new JFrame(); panel.setBackground(Color.white); panel.setPreferredSize(new Dimension(xPanelSize,yPanelSize)); panel.add(btn1); panel.add(btn2); panel.add(btn3); panel.add(btn4); BallPropagator.xmin = 0; BallPropagator.xmax = panel.xPanelSize; BallPropagator.ymin = 0; BallPropagator.ymax = panel.yPanelSize; frame.add(panel); frame.pack(); // frame.setTitle("反射するボール"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //frame.setResizable(true); frame.setVisible(true); Timer timer = new Timer(10, panel); timer.start(); } }
//BallMain.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BallMain extends JPanel implements ActionListener{ static int xPanelSize; static int yPanelSize; double x,y,r,vx,vy,ax,ay; BallPropagator b1; Color c1; BallMain(int xPanelSize, int yPanelSize){ this.xPanelSize = xPanelSize; this.yPanelSize = yPanelSize; b1 = new BallPropagator(10, 100, 100, 30, 40, 0, 9.8); ///////////////////////////////////////////// c1=Color.black; ///////////////////////////////////////////// } public void actionPerformed(ActionEvent e){ b1.xUpdate(); b1.yUpdate(); b1.vxUpdate(); b1.vyUpdate(); repaint(); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(c1); g.fillOval((int)(b1.a(x) - b1.c(r)), (int)(b1.b(y) - b1.c(r)), (int)(2*b1.c(r)), (int)(2*b1.c(r))); } }
//BallPropagator.java public class BallPropagator{ // クラスフィールド public static double dt;//プロパゲータの微小時間間隔 public static int xmin; //境界座標 public static int xmax; public static int ymin; public static int ymax; // インスタンスフィールド private double r; //ボールの半径 private double x, y; //ボールの位置(中心座標) private double vx, vy;//ボールの速度 private double ax, ay;//ボールの加速度 public static double o=5.0; double p=0.8;// 反発係数 // ???????? /////////////////////////////////////////////////////////// BallPropagator(double r,double x,double y,double vx,double vy,double ax,double ay){ this.r=r; this.x=x; this.y=y; this.vx=vx; this.vy=vy; this.ax=ax; this.ay=ay; } /////////////////////////////////////////////////////////// //x 軸方向の位置の更新 public void xUpdate() { this.x = this.x + this.vx * dt; //x 方向の反射(cf. 反発係数) if(this.x < (double)xmin+this.r ){ // this.vx = ?????????? this.vx *= -p; this.x = (double)xmin+this.r; }else if((double)xmax-this.r < x ){ // this.vx = ?????????? this.vx *= -p; this.x = (double)xmax-this.r; } } //y 軸方向の位置の更新 public void yUpdate() { this.y = this.y + this.vy * dt; //y 方向の反射(cf. 反発係数) if(this.y < (double)ymin + this.r ){ // this.vy = ?????????? this.vy *= -p; this.y = (double)ymin+this.r; }else if((double)ymax-this.r < this.y ){ // this.vy = ?????????? this.vy *= -p; this.y = (double)ymax-this.r; } } //x 軸方向の速度の更新 public void vxUpdate(){ this.vx=this.ax*dt+this.vx; } //y 軸方向の速度の更新 public void vyUpdate(){ this.vy=this.ay*dt+this.vy; // ???????? // ???????? } public void upvy(){ this.vy=this.vy+this.o; } public void downvy(){ this.vy=this.vy-this.o;} public void leftvx(){ this.vx=this.vx-this.o;} public void rightvx(){ this.vx=this.vx+this.o;} public double a(double x){ return x=this.x; } public double b(double x){ return x=this.y; } public double c(double x){ return x=this.r; } }
[Java - ボタンを押しても反応しないです|teratail](https://teratail.com/questions/278736
[Java - ボタンを押すと速度が加算されるものを作りたい|teratail](https://teratail.com/questions/278819
[Java - javaの関数が反応しない|teratail](https://teratail.com/questions/279029
3つとも同じコードに見えます。
これは3人とも同じ課題に取り組んでいるということでしょうか??
(申し上げにくいのですがあまりにもひどいコードなので)とても課題とは思えず、同一人物の投稿かと思ったのですがそうではないのですね?
回答1件
あなたの回答
tips
プレビュー