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

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

ただいまの
回答率

88.91%

javaの関数が反応しない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 171

ボタンを押すと決まった関数が呼び出されるようなプログラムを作っています。ですが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;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • TN8001

    2020/07/20 17:44

    [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

checkベストアンサー

+1

ボタンのイベント自体は動作してますね。
x,y,vx,vyUpdateメソッド系と、up,down,left,rightvx,yメソッド系を
デバッグで動作させてvx,vyの値の変化を見ればわかると思いますが、
SampleクラスとBallMainクラスのコンストラクタで
それぞれ別にBallPropagatorクラスを初期化しているため、
参照しているオブジェクトが別な物となっています。

実際にボールが描画されているのはBallMainクラスで生成されているオブジェクトなので、
Sampleクラス側で生成したBallMainクラスのb1オブジェクトからup,down,left,rightvx,yメソッドを呼び出せば、
ボタンの動作をボールに反映させられます。

一応修正したSampleクラスのソースを貼っておきますが、
とりあえず修正しただけで綺麗な構成ができてるとは言い難いので参考程度でお願いします。

//Sample.java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Sample extends JPanel implements ActionListener{

    static int xPanelSize;
    static int yPanelSize;

    double x,y,r,vx,vy,ax,ay;
    static BallMain panel;
    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;

        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");
            panel.b1.upvy();
        } else if(selectedButton==btn2) {
            System.out.println("down");
            panel.b1.downvy();
        }else if(selectedButton==btn3) {
            System.out.println("right");
            panel.b1.leftvx();
        }else{
            System.out.println("left");
            panel.b1.rightvx();
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.setColor(c1);

        g.fillOval((int)(panel.b1.a(x) - panel.b1.c(r)), (int)(panel.b1.b(y) - panel.b1.c(r)),
                (int)(2*panel.b1.c(r)), (int)(2*panel.b1.c(r)));
    }

    public static void main(String[] args) {
        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();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/20 17:10

    回答、誠にありがとうございます。SampleとBallMainという違うクラスで生成されていたから反応しなかったんですね。困っていたので本当にありがとうございます。これからも頑張っていきます!!

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る