HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

JavaFXで遊んでみる

次の記事を何気なく眺めていて、唐突にJavaFXに触れてみようと思ったらしい。

この記事ではJavaFX 1.3+NetBeans 6.9betaを使っているのだが、NetBeansを混在させて苦労したら嫌だなぁと思い、JavaFX 1.2.1+Eclipseでやることにした。
導入の参考にしたのは次のサイト。

手順をざっくりとまとめると次のとおり。

  1. JavaFX 1.2.1 SDKをダウンロード&インストール。
  2. Eclipseを(必要に応じて)ダウンロード&インストール。
    • 今回はクリーン環境で試すために、Eclipse IDE for Java EE Developersを使用。
  3. JavaFX Plugin for Eclipseをインストール。
    • http://javafx.com/downloads/eclipse-plugin/
  4. JavaFX SDKのパスの設定。
    • [Window]-[Preference]の[Java]-[Build Path]-[Classpath Variables]で"JAVAFX_HOME"の値
  5. 動作確認
    1. [Window]-[Open Perspective]-[Other...]で"JavaFX"パースペクティブを開く
    2. [File]-[New]-[Other...]で[JavaFX]-[JavaFX Project from Template]を選択
    3. 適当なテンプレートを選択して[Finish]をクリック
      • 今回はとりあえず"Drag And Drop"を選択
    4. Mainファイルを選択して、右クリック-[Run As...]-[JavaFX Application]
      • src/draganddrop/Main1.fx


で、せっかくなので(謎)、簡単な電卓アプリを作ってみた。
コメントが全然ないけど、初めてのJavaFXアプリということでさらしておく。

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.ext.swing.SwingButton;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.Font;
import javafx.scene.paint.Color;
import javafx.ext.swing.SwingTextField;
import javafx.ext.swing.SwingHorizontalAlignment;


/**
 * @author HHeLiBeX
 */
var display = SwingTextField {
    columns: 8,
	text: "0",
    editable: false
    font: Font {
        size: 24
    },
    horizontalAlignment: SwingHorizontalAlignment.RIGHT
}
var displayOp:Text = Text {
    font: Font {
        size: 24
    },
    content: ""
    translateX: bind display.translateX + display.width + 5
    translateY: 20
}
var displayedValue:Long = 0 on replace {
    display.text = "{displayedValue}";
}
var currentValue:Long = 0;
var opPressed:Boolean = false;
class CalcButton extends SwingButton {
    public-init var number = 0;
    init {
        text = "{number}";
        action = function() {
            if (opPressed) {
                displayedValue = 0;
            }
            if (0 <= displayedValue and displayedValue < 1000000000) {
                displayedValue = displayedValue * 10 + number;
            } else if (-1000000000 < displayedValue and displayedValue < 0) {
                displayedValue = displayedValue * 10 - number;
            }
            opPressed = false;
        }
    }
}
var opCopyButton = OpButton {
    text: ""
    calc: function() {
        currentValue = displayedValue;
    }
}
var clearButton = SwingButton {
    text: "C"
    translateX: 120
    translateY: 40
    action: function() {
        currentValue = 0;
        displayedValue = 0;
        prevOp = opCopyButton;
        opPressed = false;
        displayOp.content = "";
    }
}
var prevOp:OpButton = opCopyButton;
class OpButton extends SwingButton {
    init {
        action = function() {
            opPressed = true;
            prevOp.calc();
            prevOp = this;
            displayOp.content = text;
        }
    }
    var calc:function();
}
var opEqualButton = OpButton {
    text: "="
    translateX: 160
    translateY: 200
    calc: function() {
    }
}
var opPlusButton = OpButton {
    text: "+"
    translateX: 120
    translateY: 200
    calc: function() {
        currentValue = currentValue + displayedValue;
        displayedValue = currentValue;
    }
}
var opMinusButton = OpButton {
    text: "-"
    translateX: 120
    translateY: 160
    calc: function() {
        currentValue = currentValue - displayedValue;
        displayedValue = currentValue;
    }
}
var opAsterButton = OpButton {
    text: "*"
    translateX: 120
    translateY: 120
    calc: function() {
        currentValue = currentValue * displayedValue;
        displayedValue = currentValue;
    }
}
var opSlashButton = OpButton {
    text: "/"
    translateX: 120
    translateY: 80
    calc: function() {
        currentValue = currentValue / displayedValue;
        displayedValue = currentValue;
    }
}
Stage {
    title : "JavaFX Calc"
    scene: Scene {
        width: 200
        height: 300
        content: [
        display,
        displayOp,
        CalcButton { number: 7, translateX: 0, translateY: 80, }
        CalcButton { number: 8, translateX: 40, translateY: 80, }
        CalcButton { number: 9, translateX: 80, translateY: 80, }
        CalcButton { number: 4, translateX: 0, translateY: 120, }
        CalcButton { number: 5, translateX: 40, translateY: 120, }
        CalcButton { number: 6, translateX: 80, translateY: 120, }
        CalcButton { number: 1, translateX: 0, translateY: 160, }
        CalcButton { number: 2, translateX: 40, translateY: 160, }
        CalcButton { number: 3, translateX: 80, translateY: 160, }
        CalcButton { number: 0, translateX: 40, translateY: 200, }
        opPlusButton,
        opMinusButton,
        opAsterButton,
        opSlashButton,
        opEqualButton,
        clearButton
        ]
    }
}

エラーチェックをぜんぜんやっていないので、ゼロで割っちゃだめよ(謎)