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

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

ただいまの
回答率

88.92%

ボタンを押すと速度が加算されるものを作りたい

受付中

回答 1

投稿

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

asfrofjasf

score 0

前提・実現したいこと

自作でボタンを押すと速度が加算されるものを作っています。しかしエラーが出てしまうのでなぜなのか教えていただきたいです。

コンパイルするとエラーが出ます

発生している問題・エラーメッセージ

Sample.javaのupvx()やdownvx()などの4つでそれぞれ同じエラーが出ます

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Sample.actionPerformed(Sample.java:66)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6401)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)

該当のソースコード

//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;
          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 dctionPerformed(ActionEvent e){

        //ボールb1 の位置の更新
        b1.xUpdate();
        b1.yUpdate();
        //ボールb1 の速度の更新
        b1.vxUpdate();
        b1.vyUpdate();


        // 再描画
        repaint();

    }
    public void actionPerformed(ActionEvent e){
        JButton selectedButton = (JButton)e.getSource();
    if(selectedButton==btn1){
        System.out.println("up");
        b1.upvy();

        repaint();
    }else if(selectedButton==btn2){
        System.out.println("down");
        b1.downvy();

        repaint();
    }else if(selectedButton==btn3){
        System.out.println("left");
        b1.leftvx();

        repaint();
    }else{
        System.out.println("right");
        b1.rightvx();

        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)));



    }



    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;
    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;
    }

    public void xUpdate() {
        this.x = this.x + this.vx * dt;

        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;
        }
    }

    public void yUpdate() {
        this.y = this.y + this.vy * dt;

        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;
        }
    }

    public void vxUpdate(){

        this.vx=this.ax*dt+this.vx;

    }

    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

+1

Sampleのb1がどこでも初期化されていないから、ですね。

public class Sample extends JPanel implements ActionListener{
...
   BallPropagator b1;
...
    public void actionPerformed(ActionEvent e){
...
        b1.upvy();

BallMainのb1は初期化されているようですが、BallMainを使っている場所が、みたらない。

public class BallMain extends JPanel implements ActionListener{
...
    BallPropagator b1;
...
        b1 = new BallPropagator(10, 100, 100, 30, 40, 0, 9.8);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/19 14:21

    ご返事ありがとうございます。初期化してないからエラーが出てしまったのですね。しかし、これを実行するとvxup()などが機能しなくなるのですがこれは初期化したからでしょうか?

    キャンセル

  • 2020/07/19 14:49

    ナニをどのように修正したのかわからないのに、わたしにその理由がわかるわけはありません。一般的なNullPointerExcptionの原因を指摘しただけですので、動作については自力で解決してください。

    キャンセル

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

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

関連した質問

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