🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1412閲覧

ボタンで行う加算演算の修正

nakagen

総合スコア24

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2021/02/09 16:30

編集2021/02/09 18:17

前提・実現したいこと

※先程の記載の説明が不足していたため、改めて補足致します。

下記のソースコードの通り、+= を用いて加算演算を行えるようにしたのですが、iが0の状態で、1回押しても数字が反映されず2回目で反映される形になります。

1回目で、反映させたいのですが、この場合の改善策を教えて頂くことをお願いすることは出来ますでしょうか?

よろしくお願いします。

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

1回目で押すと、数値が反映されず、2回目で反映されます。

該当のソースコード

javafx

1 2import java.io.IOException; 3 4import javafx.application.Application; 5import javafx.scene.Scene; 6import javafx.scene.control.Button; 7import javafx.scene.control.Label; 8import javafx.scene.layout.BorderPane; 9import javafx.scene.layout.HBox; 10import javafx.stage.Stage; 11 12public class aaa extends Application{ 13 private Label lb; 14 private Button bt,bt1,bt2,bt3,bt4; 15 private int i; 16 public static void main(String[]args) { 17 launch(args); 18 } 19 public void start(Stage stage)throws IOException{ 20 lb = new Label("数値;"+i); 21 bt = new Button("1up"); 22 bt1 = new Button("2up"); 23 bt2 = new Button("3up"); 24 bt3 = new Button("4up"); 25 bt4 = new Button("5up"); 26 HBox hb = new HBox(); 27 hb.getChildren().add(bt); 28 hb.getChildren().add(bt1); 29 hb.getChildren().add(bt2); 30 hb.getChildren().add(bt3); 31 hb.getChildren().add(bt4); 32 BorderPane bp = new BorderPane(); 33 34 bp.setCenter(lb); 35 bp.setBottom(hb); 36 37 Scene sc = new Scene(bp,300,300); 38 stage.setScene(sc); 39 stage.show(); 40 bt.setOnAction(ae -> { 41 lb.setText("数値;"+(i)); 42 i += 1; 43 }); 44 bt1.setOnAction(ae1 -> { 45 lb.setText("数値;"+(i)); 46 i += 2; 47 }); 48 bt2.setOnAction(ae2 -> { 49 lb.setText("数値;"+(i)); 50 i += 3; 51 }); 52 bt3.setOnAction(ae3 -> { 53 lb.setText("数値;"+(i)); 54 i += 4; 55 }); 56 bt4.setOnAction(ae4 -> { 57 lb.setText("数値;"+(i)); 58 i += 5; 59 }); 60 } 61} 62

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

jdk14

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/09 17:58 編集

聞きたい事が良く分からないです。 ソース自体は各ボタンの押下イベントで、ボタン事に設定した加算値の増加量が+1なんだから、 どう頑張っても+1ずつしか増えない。 加算した後の値をiで維持していないのだから、常に【0 + 加算値】なんだけど、 回答者側はこの辺はどう整理すればいいですか?要件のお話ですね。
退会済みユーザー

退会済みユーザー

2021/02/09 18:00

具体的な話。ここをはっきりさせて欲しい。 初期状態から1upを押し続けたら、どう画面に出るのが正しいのか 初期状態から2upを押し続けたら、どう画面に出るのが正しいのか 1upを何回か押した後に、2upを押したらどう画面に出るのが正しいのか
nakagen

2021/02/09 18:11

すみませんでした、上記のコードを改めて改正しますので、そちらを改めて見て頂けませんでしょうか・・・?
nakagen

2021/02/09 18:18

初期状態から1upを押し続けたら、どう画面に出るのが正しいのか →常に、iに1が加算されていく状態が正しいです 初期状態から2upを押し続けたら、どう画面に出るのが正しいのか →常に、iに2が加算されていく状態が正しいです 1upを何回か押した後に、2upを押したらどう画面に出るのが正しいのか →1×n+2=1n+2といった答えが欲しいです
guest

回答1

0

ベストアンサー

勝手にこのように要件を解釈します。
初期値0として、1~5upボタン押下したら、初期値に加算する。

1up を押したら、123、…
2up を押したら、246、…
1up を2回、2up を2回押したら、1246、…
みたいな動きをさせたいのだろうと予測する。

問題点1. 加算後の値を保持していない

値を保持したいのはiと予測するが、各ボタン押下イベント内でiに何かを代入している形跡はない

問題点2. 用途不明な増加量の加算をしている

各ボタンの増加値を収めたであろう変数。i1i5になぜか+1している理由がよく分からない。
増加量なんだから、変えちゃダメだろう。

ちなみに++はインクリメント。
1しか増えないので、加算処理はi += (増加量);みたいな書き方をしないとダメだろう。

上記問題点を解消すると、質問者さんの理想の形に近づくと思う。
頑張ってください。

修正ソースに対する指摘

1回押しても数字が反映されず2回目で反映される形になります。

画面への出力setText(~)前後でiには何が入っているでしょうか?
デバッグすれば分かると思います。

順番が重要です。そこをクリアするだけでこうなりますよ。
頑張ってください。
イメージ説明

最後のコメントが怪しいのでたとえ話

金がないので日当1万円の仕事に友人と一緒にすることにしました。

仕事前日
友「なー、お前この仕事でいくらもらった?」
私「まだ仕事してないし、0円に決まってるじゃないか!」

※画面初期化時の例え

初日朝(1)
友「なー、お前この仕事でいくらもらった?」
私「ん、0円だけど」

その日の夕方に1万円もらって帰宅した。

※1up一回押下した時の例え

2日目朝
友「なー、お前この仕事でいくらもらった?」
私「ん、1万円だけど」

その日の夕方に1万円もらって帰宅した。合計2万円である。

※1upをもう一回押下した時の例え

3日目朝
友「なー、お前この仕事でいくらもらった?」
私「ん、2万円だけど」

その日の夕方に1万円もらって帰宅した。合計3万円である。

※1upを更にもう一回押下した時の例え

友人が聞きに来るのが朝じゃなくて日当を貰った夕方以降だったら、その日に稼いだ金額を加味した回答が出来るよね

投稿2021/02/09 18:17

編集2021/02/10 06:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2021/02/09 18:19

ご回答をありがとうございます!すみません、修正してしまったので、改めて読んで頂くことは出来ませんでしょうか・・・?よろしくお願いします。
nakagen

2021/02/09 18:25

すみません、デバックとは何をすれば良いのか教えて頂くことは可能でしょうか・・・?重ね重ねすみません・・・
退会済みユーザー

退会済みユーザー

2021/02/09 18:25

回答修正しました。
退会済みユーザー

退会済みユーザー

2021/02/09 18:32 編集

PCやスマホは調べものが得意なので自力で調べるようにした方が良いでしょう。 教えてクンと言われるのは心外でしょうから。その上で質問した方が心証が良いです。 https://www.google.com/search?q=java+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0+%E6%96%B9%E6%B3%95&oq=java+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0+%E6%96%B9%E6%B3%95&aqs=chrome..69i57.5577j0j7&sourceid=chrome&ie=UTF-8 開発環境に何を使っているのかが分からないので何とも言えないですが、 どんな環境でも出来るとしたら【System.out.println(i)】あたりでで変数【i】の中身を 画面出力前後で確認する事でしょう。
nakagen

2021/02/09 18:32

今のところ、思い浮かぶのが「()」か「+」なのですが、そのいずれかを消すと言うことでしょうか・・・?
退会済みユーザー

退会済みユーザー

2021/02/09 18:33

だから、手元にソースがあるんですからやってみましょうよ。 で、想定する動きなら良し。ダメならその旨再質問してください。
nakagen

2021/02/09 18:42 編集

すみません、デバックモードを起動したのですが、特に変化が無かったのですが、この場合どのようなことが考えられますでしょうか・・・? 以下、System.outで試した結果です 0 //1up 1 //1up 2 //1up 3 // 1up 4 // 2up 6 // 2up 8 //2up 10 //2up
退会済みユーザー

退会済みユーザー

2021/02/09 18:44

デバッグモードが正しく扱えているかどうかは、そちらの開発環境が全く分からないので答えられません。 私はエスパーじゃないので。 正直デバッグモードについてまで書きたくないので、printlnを書いてラベルにsetTextする前後でiの値の変化を見てみて下さい。 気付けると思うんで。
nakagen

2021/02/09 18:47 編集

lb.setText("数値;"+(i += 1)); これで、なんとか加算演算ができました・・・ つまり、iが2つあったため、1回目が反映されなかったということでしょうか・・・?
退会済みユーザー

退会済みユーザー

2021/02/09 18:47

よーく考えて下さいね。 例えば最初の1up押下時に1回目は【0】が出るんですよ。つまり、【i】には【0】が入っている。 でも、nakagenさんが出したいのは【1】なんですよね? では、【i】の値がどうなってたら思い通りの結果になりますか?
退会済みユーザー

退会済みユーザー

2021/02/09 18:50 編集

解決した様で何よりです。 > つまり、iが2つあったため、1回目が反映されなかったということでしょうか・・・? ちがいます。 単純に加算処理をする前に画面に出してたからです。
nakagen

2021/02/09 18:55 編集

最後まで、付き合って頂き本当にありがとうございました・・・ なるほどです・・・、最初にあったiが画面処理をしたのが原因でしたか・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問