JavaFX で足し算のお勉強

JavaFX を少し前から触りだしたのですがさっぱり解らない状態のままです。

某サイトの記事を参考に進めているのですが行き当たりばったりでやってます。

ということで今回はちょっとした足し算を出題するプログラムを組んでみることにしました。

特に難しいことはやってないし、GUI の設計は JavaFX Scene Builder でポトペタやれば NetBeans IDE との連携で楽ちんだよ!

AnchorPane のコードプロパティでコントローラ・クラスを NetBeans IDE との連携により選択できます。

レイアウトとかの編集も視覚的に確認できて楽です!

4

 

Button のコードプロパティでは fx:id , On Action などの設定も可能です。

NetBeans IDE との連携機能で JavaFX アプリを創るにはこれしか無いってほど強力ですね。

5

 

そんなこんなでできあがったのはこんな感じの完成度の低いアプリです。

1

2

3

 

TextField には入力制限をかけたかったのですが面倒なことをしなくてはいけなそうなので 0 から 9 以外の文字(全角文字も)が入力された場合はエラーメッセージを出すように手を抜きました。

標準で入力制限をかけるようなものが用意されてないのは残念です。(あるかもしれません。)

JavaFX はじめて 3時間くらいでここまで出来るのは優秀な開発環境のおかげですね。

それではソースコードを載せておきますね。

まだ JavaFX をはじめたばかりなので間違いがあるかもしれませんが笑って許してくださいね。(^_^;)

package jp.yucchi.calc;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Calc extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("CalcForm.fxml"));

        Scene scene = new Scene(root);

        stage.setTitle("足し算できますか?");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}
package jp.yucchi.calc;

import java.awt.Toolkit;
import static java.lang.Integer.parseInt;
import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class CalcFormController implements Initializable {

    private int x;
    private int y;
    private int resultAnswer;

    Random rnd = new Random();

    private final Media start = new Media(getClass().getResource("start.mp3").toExternalForm());
    private final Media ok = new Media(getClass().getResource("ok.mp3").toExternalForm());
    private final Media ng = new Media(getClass().getResource("ng.mp3").toExternalForm());

    MediaPlayer mp_start = new MediaPlayer(start);
    MediaPlayer mp_ok = new MediaPlayer(ok);
    MediaPlayer mp_ng = new MediaPlayer(ng);

    @FXML
    private Label questionLabel;

    @FXML
    private TextField answerField;

    @FXML
    private Label resultLabel;

    @FXML
    public void handleAnswer(ActionEvent event) {

        Pattern intPattern = Pattern.compile("[0-9]+");
        Matcher match = intPattern.matcher(answerField.getText());

        if (match.matches() != false || answerField.getText().isEmpty()) {
        } else {
            resultLabel.setText("数値を入力してね!");
            Toolkit.getDefaultToolkit().beep();
        }
        if (answerField.getText().isEmpty()) {
            resultLabel.setText("答えを入力してね!");
            Toolkit.getDefaultToolkit().beep();
        } else {
            boolean result = calc(answerField.getText());
            if (result) {
                resultLabel.setText("正解!");
                mp_ok.play();
            } else {
                resultLabel.setText("不正解!");
                mp_ng.play();
            }
        }
    }

    @FXML
    public void handleClear(ActionEvent event) {
        answerField.clear();
        resultLabel.setText(null);
        x = rnd.nextInt(999) + 1;
        y = rnd.nextInt(999) + 1;
        resultAnswer = x + y;
        questionLabel.setText(" " + x + " + " + y + " = ");
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        x = rnd.nextInt(999) + 1;
        y = rnd.nextInt(999) + 1;
        resultAnswer = x + y;
        questionLabel.setText(" " + x + " + " + y + " = ");
        mp_start.play();
    }

    private boolean calc(String ans) {
        int answer = parseInt(ans);
        return answer == resultAnswer;
    }

}











    
        
            
                
                    
                        
                        
                    
                
                
                    
                        

ついでに Java Web Start もリンクしておきますね。

 

Webstart: click to launch Calc app as webstart

 

適当だけど組んだプログラムが動くってことは今でも素直に嬉しい!

もっといろいろ楽しめそうな気がしてきました。(^_^)

cludia_2013_08_05_001

 

Hatena タグ: ,

Windows 8.1 Preview

Windows 8.1 Preview をインストールしてみた。

スタートボタンが復活とか噂になっていたので期待したが裏切られた。

見た目では Windows 7 のようにスタートボタンの機能の復活と思わせるが、いやいや復活させた感が思いっきり感じられる。

とても中途半端に感じるのは私だけでしょうか?

1

 

スタートボタンをクリックするとスタート画面へジャンプしてしまいます。

そこで右クリックすると下図のようなコンテキストメニューが表示されます。

3

 

う~ん。。。。なんでこんな仕様にしたんだろう?

ただし、ログイン後にデスクトップへジャンプする機能はつけられたようです。

2

 

素直に Windows 7 と同じスタートメニューを用意したほうがユーザーには喜ばれると思うんですけどね。

それとも私がモダン OS についていけないだけなのか? (>_<。)

 

おまけ

Windows 8.1 Preview をインストールしてると Micosoft アカウントでしかインストールを進められないような仕組みに遭遇します。

これの回避方法は Microsoft アカウントの登録に失敗を繰り返せばローカルアカウントの作成を促してくれます。

セキュリティコードの入力をたまたま間違えて気付きました。

いい加減な甘い性格が功を奏しました。(^_^;)

とりあえずインストールは問題なくできましたので暇な時に使ってみたいと思ってます。

なにか感動的な変更ってあるのかなぁ?

Hatena タグ: