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

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

ただいまの
回答率

88.23%

[Java]マウスのクリックに応じてテキストフィールドの中身を更新したい

受付中

回答 2

投稿

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

popnapopoco

score 4

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
プログラミング、Java初心者です。UFOをマウスで動かして敵(星雲)をクリックすると点数、何もないところをクリックした場合は空振りした回数を表示するようにしたいのですが、テキストフィールドの中身が初期値のまま変わりません。
点数と空振りした回数を初期値の0から更新してテキストフィールドの中身を変えるにはどうすればよいかアドバイスをよろしくお願いいたします。
ふんわりとした質問で申し訳ありません。

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

テキストフィールドの中身が変わらない

該当のソースコード

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ThingDraw2 extends JFrame{
String imageNames[]= {"ufo.png","explode1.png","explode2.png",
"kaniseiun.png","catseye.png","mazeran.png"};//星雲とUFOのイメージ
static JTextField scoredisp;     //点数と空振り回数表示用のテキストフィールド
static int hitscore=0;      //星雲(敵)にヒットした際の点数を入れる変数
static int wavtimes=0;           //何もないところをクリックした回数を入れる変数

public ThingDraw2(String title) {
super(title);
setSize(650,650);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationByPlatform(true);
setLayout(new BorderLayout());        

Image im[];
im=new Image[imageNames.length];
for(int i=0;i<im.length;i++) {
im[i]=new ImageIcon(imageNames[i]).getImage();
}
ThingPanel2 panel=new ThingPanel2(im,this);
scoredisp=new JTextField("点数="+hitscore+",空振り回数="+wavtimes);
add(scoredisp,BorderLayout.NORTH);
add(panel,BorderLayout.CENTER);
}

public static void main(String args[]) {
ThingDraw2 frame=new ThingDraw2("クラスを派生させる");
frame.setVisible(true);
}

//Thingを拡張してNeburaクラスを作る(別ファイルにしておいたほうがいい)

class ThingPanel2 extends JPanel implements MouseMotionListener,MouseListener{
int width=650,height=650;
//int hitscore=0,wavtimes=0;
Image image[];
//JTextField scoredisp;
JFrame frame;
public    Thing ufo;
Thing enemy;
Thing blowup[];

ThingPanel2(Image im[],JFrame fr){
super();
image=im;
frame=fr;
//パネルの大きさをセット
setMinimumSize(new Dimension(width,height));
setPreferredSize(new Dimension(width,height));

addMouseMotionListener(this);
addMouseListener(this);

setBackground(Color.black);
ufo=new Thing(image[0],this);
enemy=new Nebura(image[3],this);
blowup=new Thing[100];
//scoredisp=new JTextField("点数="+hitscore+"空振り回数="+wavtimes);
//scoredisp.setBounds(0, 0, 180, 30);

}
/*----------以下テキストフィールドの中身を変えるためのメソッド---------*/
public void score(int hit,int waving) {              //hitはヒット点数、wavingは空振りした回数
hit=ThingDraw2.hitscore;
waving=ThingDraw2.wavtimes;
for(int i=0;i<blowup.length;i++) {
if(blowup[i]==null) {
if(ufo.hit(enemy)) { //hitはboolean型 星雲(敵)をクリックしたとき
hit+=10;
scoredisp.setText("点数="+hit+",空振り回数="+waving);
}else if(ufo.hit(null)) {  //何もクリックしなかったとき
waving++;
scoredisp.setText("点数="+hit+",空振り回数="+waving);
}
}
}

}
/*----------------------------------------------------------------*/

//幅と高さを出す
public int getWidth() {return width;}
public int getHeight() {return height;}

//実際の描画を行うメソッド
public void paintComponent(Graphics g) {
super.paintComponent(g);            //描画のデフォルト動作
//爆発イメージを描画

for(int i=0;i<blowup.length;i++) {
if(blowup[i]!=null) {
blowup[i].draw(g);
}
}
if(enemy!=null) {
enemy.draw(g);
}
if(ufo!=null) {
ufo.draw(g);
}
}
//マウスの移動を検出した時に呼び出されるメソッド
public void mouseMoved(MouseEvent e) {
if(ufo!=null)ufo.move(e.getX(), e.getY());        //マウス位置にUFOを動かす
if(enemy!=null)enemy.move(e.getX(), e.getY());    //敵を動かす※座標値は意味ない
frame.repaint();
}
//マウスをドラッグしたまま移動した時に呼び出されるメソッド
public void mouseDragged(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
for(int i=0;i<blowup.length;i++) {
if(blowup[i]==null) {
if(ufo.hit(enemy)) {
blowup[i]=new Thing(image[2],this);
blowup[i].setLocation(enemy.getX(),enemy.getY());
enemy=null;
}else {
blowup[i]=new Thing(image[1],this);
blowup[i].setLocation(e.getX(),e.getY());
}
frame.repaint();
break;
}
}
}

public void mouseEntered(MouseEvent e) {
if(enemy==null) {
enemy=new Nebura(image[3],this);
}
if(ufo==null) {
ufo=new Thing(image[0],this);
ufo.move(e.getX(), e.getY());
}
frame.getIgnoreRepaint();
}
public void mouseExited(MouseEvent e) {
ufo=null;
frame.repaint();
}

public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}

}

試したこと

敵をクリックしたときの点数と空振り回数の変数をグローバル変数にしてみましたが、変わりませんでした。

補足情報(FW/ツールのバージョンなど)

特にありません

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • y_waiwai

    2019/11/10 23:50

    このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください

    キャンセル

  • jimbe

    2019/11/11 00:56

    使用している Thing や Nebura というクラスもご提示願えますか.

    キャンセル

回答 2

0

まず score メソッドの呼び出しがありません.

そして, ThingPanel2 は ThingDraw2 の非 static な内部クラスですので, ThingPanel2 内部に同名の変数がなければ, ThingDraw2 のフィールドを直接使用できると思います.

 private JTextField scoredisp; //点数と空振り回数表示用のテキストフィールド
 private int hitscore=0; //星雲(敵)にヒットした際の点数を入れる変数
 private int wavtimes=0; //何もないところをクリックした回数を入れる変数
public void score() {
  for(int i=0;i<blowup.length;i++) {
    if(blowup[i]==null) {
      if(ufo.hit(enemy)) { //hitはboolean型 星雲(敵)をクリックしたとき
        hitscore+=10;
        scoredisp.setText("点数="+hitscore+",空振り回数="+wavtimes);
      }else if(ufo.hit(null)) { //何もクリックしなかったとき
        wavtimes++;
        scoredisp.setText("点数="+hitscore+",空振り回数="+wavtimes);
      }
    }
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

解決しました。回答ありがとうございました。情報不足申し訳ございませんでした。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/11 12:54

    ベストアンサーを選択することで「解決済み」となります.
    また, このサイトは, 後進のために情報を蓄積する目的があります.
    popnapopoco さんと同じ状況に陥った方がこのご質問を見た時に解決できるよう, どうすることで解決したのかを具体的にご記述ください.

    キャンセル

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

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

関連した質問

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