BlueJの使い方~インストール、クラス作成、サンプルプロジェクト~

BlueJの使い方

Oracle製のIDE「BlueJ」を使ってみようと思います。
そもそも、「なんで使ってみようと思ったのか?」に関して、以下の理由があります。
下の動画のように、作成したクラスがクラス図(簡易バージョン)で表現されるところです。
<HelloWorldの実行動画>

他にも、継承関係も表示できる用ですので、クラス間の関係性を説明するときに、自分で確認するときにも便利です。

ライブラリの追加

スタックオーバーフローより
「Tools -> Preferences -> Libraries -> Add file」ということで。

「ツール→カスタマイズ→ライブラリタブ」を開いて、Jarファイルを追加、BlueJを再起動することで使用可能になるようです。

BlueJインストール

こちらのページからダウンロードできます。MSIファイルなので、クリックするだけでインストールできました。

そして、ドキュメント、サンプルプロジェクトもそろっているようです。

そんなわけで、上記の赤丸部分をクリックしてダウンロードした。ファイルの中身を見てみます。

注意点

コンパイルするときには、修正したクラスを全て、コンパイルする必要があります。

サンプルプロジェクト

ダウンロードしたprojects.zipを展開すると、Chapter01~16までプロジェクトが入っていました。
これらの中にあるフォルダが、BlueJで開くべきプロジェクトになります。

Chapter1のプロジェクト(figure)

開いたプロジェクトは下のような形でした。

これに、メインクラスを作成し、メインメソッドを追加して実行しました。

<実行結果>

サンプルプロジェクトを見る

ダウンロードしたZIPファイルを展開したあと、「projects」-> 「chapter01」-> プロジェクトとフォルダを下がっていく形になります。
具体的には、「projects」-> 「chapter01」-> 「home」を開きます。

プロジェクトを開いた結果

ここから、Javaプログラムの解説になります。

Java プログラム

開いたプロジェクトは、下のようなクラスがあります。

  • Picture
  • Circle
  • Square
  • Triangle
  • Person
  • Canvas

クラスの関係について

上記のクラス図から、Circle, Square, Triangleの3クラスがPictureクラスに呼び出されています。

そして、Picture以外のクラスがCanvasクラスを呼び出しています。

なので、ここに「」クラスを作成し、Picture、Personクラスを起動するメインメソッドを実装、起動します。

Pictureクラス

このクラスは、Circle, Square, Triangleの3クラスを呼び出しています。
詳細は、フィールド変数に上記の3クラスを持っています。
そして、コンストラクタで各クラスのインスタンス化を行い。
draw()メソッドで描画を行っています。

なので、メインメソッドでは、インスタンス化とdraw()を呼び出しを行っています。

/**
 * This class represents a simple picture. You can draw the picture using
 * the draw method. But wait, there's more: being an electronic picture, it
 * can be changed. You can set it to black-and-white display and back to
 * colors (only after it's been drawn, of course).
 *
 * This class was written as an early example for teaching Java with BlueJ.
 * 
 * @author  Michael Kölling and David J. Barnes
 * @version 2016.02.29
 */
public class Picture
{
    private Square wall;
    private Square window;
    private Triangle roof;
    private Circle sun;
    private boolean drawn;

    /**
     * Constructor for objects of class Picture
     */
    public Picture()
    {
        wall = new Square();
        window = new Square();
        roof = new Triangle();
        sun = new Circle();
        drawn = false;
    }

    /**
     * Draw this picture.
     */
    public void draw()
    {
        if(!drawn) {
            wall.moveHorizontal(-140);
            wall.moveVertical(20);
            wall.changeSize(120);
            wall.makeVisible();

            window.changeColor("black");
            window.moveHorizontal(-120);
            window.moveVertical(40);
            window.changeSize(40);
            window.makeVisible();

            roof.changeSize(60, 180);
            roof.moveHorizontal(20);
            roof.moveVertical(-60);
            roof.makeVisible();

            sun.changeColor("yellow");
            sun.moveHorizontal(100);
            sun.moveVertical(-40);
            sun.changeSize(80);
            sun.makeVisible();
            drawn = true;
        }
    }

    /**
     * Change this picture to black/white display
     */
    public void setBlackAndWhite()
    {
        wall.changeColor("black");
        window.changeColor("white");
        roof.changeColor("black");
        sun.changeColor("black");
    }

    /**
     * Change this picture to use color display
     */
    public void setColor()
    {
        wall.changeColor("red");
        window.changeColor("black");
        roof.changeColor("green");
        sun.changeColor("yellow");
    }
}

Mainクラス

このクラスは、筆者が作成したクラスです。単純にPictureクラスとPersonクラスをインスタンス化してそれぞれ描画するメソッドを起動しています。

public class Main
{
  public static void main(String[] args) {
      Picture pic = new Picture();
      Person per = new Person();

      pic.draw();
      per.makeVisible();
  }
}

Extension(拡張)

拡張機能に関して、こちらの記事にありました。

BlueJはSwingを使用して作成されているのか。。。拡張するのにSwingを使用して拡張するようです。

次の例では、ユーザーが開いたすべての BlueJ プロジェクトの名前をログに記録する拡張機能を実装しSystem.out 、他の拡張機能の使用方法を示します。インストールすると、次のようにも表示されます。

  • BlueJ ヘルプメニューの「Installed Extensions」パネルにあるエントリ
  • (あまり役に立たない) BlueJ の [ツール] メニューへのメニュー エントリ、および既存のクラスのソース コードにコメントを追加するものを含む、クラスおよびオブジェクト用に表示されるメニューへのエントリ。
  • Tools/Preferences/Extensions パネルのエントリで、お気に入りの色を入力 (および保存) します。
    拡張機能の完全なソース コードはこちらです。

単体テスト

こちらにあるドキュメントを見るとやり方が書いてあるのですが、ちょっと違うようで。。。

テストクラスを作成する

下の図のように、対象クラスを右クリックします。そして、「テストクラスの作成」を選択します。

すると、下のようなクラスが作成されます。
対象にしているクラスはXMLUtilクラスです。

作成したクラスは、下のように表示されます。

Java Basic GUI作成〜コマンド追加方法〜

イントロダクション

前回までで、「コマンド画面」から入力した文字をコマンドとして取得して、プロパティファイルに登録してある、完全クラス名よりクラスを新規で追加して実行できるように修正しました。

今回のやること

ようやく・・・クローリングに着手できます。
今までやってきたことで、「コマンド1個」につき「処理クラス1個」の関係を動的に作成出来るようになりました。

<手順>
1. プロパティファイル「CmdCls.properties」にコマンド=完全クラス名となるように行を追加する。

(例)[CmdCls.properties]
すでに登録されているクラスが以下の部分です。
「acc」がコマンド、処理を実行するのは「UrlAccessor」クラスです。

acc=jp.zenryoku.apps.UrlAccessor

プロパティを追加する場合は、以下のようになります。
「hello」がコマンドで「Hello」がクラスです。

acc=jp.zenryoku.apps.UrlAccessor
hello=jp.zenryoku.apps.Hello

ちょいとクラスを作成してみました。

Helloクラス

```java
public class Hello implements CommandIF {
public void execute() {
System.out.println("Hello Workd");
}
}
```
コマンドで使用するクラスには「CommandIF」インターフェースを実装する必要があります。逆に言うと上記のインターフェースを実装してプロパティファイルに追加すればコマンドで実行できます。

プロパティファイル[CmdCls.properties]

acc=jp.zenryoku.apps.UrlAccessor
hello=jp.zenryoku.apps.Hello

実行結果

クローリング処理の追加は次回やります。



## ポリモーフィズム
CommandIF(インタフェース)を使用したポリモーフィズムの実行動画があります。

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

Java Basic GUI作成〜今までのまとめ〜

イントロダクション

前回は、Javaアプリからgoogleのホームページ(検索画面)にアクセスして開く為の設計を行い、コマンドを実行する為のプロパティファイルを参照してコマンドに対応したクラス名を取得する為の実装を行いました。

Introduction

Last time we designed to access google home page.And create a property file to execute command to get class for each functions.

途中、クローリングなど実装しようと思ったのでクローリングについて調べました。
今回は、コマンドを実行するところをやります。

前回までの実装内容

画面全体をテキストエリアとして表示する
入力画面の入力チェック部分を作成する
画面の入力制御(上下のボタンを無効にする)
コマンドの取得を行う
プロパティファイルを読む

設計

コマンドの文字列をキーにして完全クラス名を取得します。この「完全クラス名」というのは、パッケージ名を含む全体のクラス名のことです。
作成中の「CmdView」クラスの完全クラス名は「jp.zenryoku.game.gui.CmdView」になります。

そして、ちょっとややこしいのですがコマンドを取得して

String command = getCommand(allText);

コマンドの実行を行うときに

executeCmd(command);

プロパティファイルを取得しておきたいのでテキストエリアを作成するときに一緒に読み込みを行います。※読み込み確認用にコンソール出力します。

// プロパティファイルのロード
bndle = ResourceBundle.getBundle(CMD_PROPERTY);
System.out.println("Properties: " + bndle.getString("acc"));

上記のResourceBundleクラスはビルドパス上にあるgetBundle(XXXX);にある「XXXX」のファイル名を検索して取得します。※XXXX.propertiesを検索

筆者はプロジェクトにリソースフォルダ「resources」を追加して「resources/CmdCls.properties」のように作成いたしました。

前回までのソース

public class CmdView extends Application {
    /** 画面の横サイズ */
    private static final int VIEW_WIDTH = 300;
    /** 画面のたてサイズ */
    private static final int VIEW_HEIGHT = 300;
    /** コマンドの入力開始文字 */
    private static final String CMD_START = "Cmd $ >";
    /** 改行コード */
    private static final String LINE_SEPARETOR = System.getProperty("line.separator");
    /** プロパティファイル名 */
    private static final String CMD_PROPERTY = "CmdCls";
    /** 入力前のカーソル位置 */
    private int cursorPos;
    /** リソースバンドル */
    private ResourceBundle bndle;

    @Override
    public void start(Stage primary) {
        TextArea area = createTextArea();
        Group root = new Group();
        root.getChildren().add(area);
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primary.setScene(scene);
        primary.show();

        // プロパティファイルのロード
        bndle = ResourceBundle.getBundle(CMD_PROPERTY);
        System.out.println("Properties: " + bndle.getString("acc"));
    }

    /**
     * TextAreaを作成して返却する
     * @return TextArea
     */
    private TextArea createTextArea() {
        TextArea area = new TextArea();
        // 縦横の幅を設定する
        area.setPrefWidth(VIEW_WIDTH);
        area.setPrefHeight(VIEW_HEIGHT);
        area.setOnKeyPressed(createKeyPressEvent());
        // 初期表示文字を設定する
        area.setText("Hello user please input command!" + LINE_SEPARETOR + CMD_START);
        // テキストエリアの文字列数
        int textLen = area.getText().length();
        // 初期カーソル位置
        cursorPos = textLen;
        area.positionCaret(textLen);

        return area;
    }

    /**
     * イベント処理を行うクラスを生成<BR/>
     * ・入力チェックを行い、禁止入力があった場合はカーソルを元の位置に戻す。
     * @return キー入力のイベント処理クラス
     */
    private EventHandler<KeyEvent> createKeyPressEvent() {
        return new EventHandler<KeyEvent>() {
            public void handle(KeyEvent evt) {
                // テキストエリアを取得する
                TextArea src = (TextArea) evt.getSource();
                // 入力を無効にする
                if (isDisabledInput(evt)) {
                    System.out.println("*** isDisable ***");
                    resetCursor(src);
                    return;
                }
                if (KeyCode.ENTER.equals(evt.getCode())) {
                    // テキストエリア内の文字列を全て取得
                    String allText = src.getText();
                    String command = getCommand(allText);
                    src.setText(allText + CMD_START);
                    // "Cmd $ "の文字列の位置を取得
                    System.out.println("Command: " + command);
                    // コマンドの実行
                    executeCmd(command);
                    cursorPos = allText.length() + CMD_START.length();
                    src.positionCaret(cursorPos);
                }
                if (KeyCode.LEFT.equals(evt.getCode())) {
                    // 左の矢印が押下された時
                    src.positionCaret(cursorPos);
                }
                // チェック用のコンソール出力処理
                System.out.println("EventType: " + evt.getCode());
            }
        };
    }

    /**
     * キーボードより入力したキーで受け付けないものを<BR/>
     * 判定する
     * @param evt
     * @return true: 受け付けない入力  /  false: 受け付ける入力
     */
    private boolean isDisabledInput(KeyEvent evt) {
        boolean isDisable = false;
        // 入力許可キーのKeyCodeリスト
        List<KeyCode> acList = createAcceptList();

        // チェック処理: 入力禁止するキーの有無をチェック
        return acList.contains(evt.getCode());
    }
    /**
     * プロパティファイル、キーを指定して対象のプロパティを<BR/>
     * 取得する
     *
     * @param propNane プロパティファイル名
     * @param key プロパティのキー
     * @return プロパティの値
     */
    @Deprecated // 使用しないメソッド
    private String getTargetProperty(String propNane, String key) {
        String propStr = null;
        return propStr;
    }

    /**
     * チェック用のリストを作成して返却します<BR/>
     * 入力禁止のKeyCodeを追加
     * @return チェック用のリスト
     */
    private List<KeyCode> createAcceptList() {
        List<KeyCode> acList = new ArrayList<KeyCode>();
        acList.add(KeyCode.UP);
        acList.add(KeyCode.DOWN);

        return acList;
    }

    /**
     * カーソルの移動をしないようにします。
     * @param src
     */
    private void resetCursor(TextArea src) {
        // 始めのカーソル位置を設定する
        src.positionCaret(cursorPos);
    }

    /**
     * コマンドを取得します<BR/>
     * @param text テキストエリアにある文字列全部
     * @return 入力した文字列部分のみ
     */
    private String getCommand(String text) {
        String[] lines = text.split(LINE_SEPARETOR);
        String target = lines[lines.length - 1];
        return target.substring(CMD_START.length());
    }

    /**
     * コマンドを実行します<BR/>
     * 登録したコマンドにない入力の時は<BR/>
     * エラーメッセージをテキストエリアに出力します。
     * @param command コマンド文字列
     */
    private void executeCmd(String command) {
        try {
            String className = bndle.getString(command);
            System.out.println("ClassName: " + className);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    /** メインメソッド */
    public static void main(String[] args) {
        launch();
    }
}

だんだん長くなってきましたが、慣れれば長いのも気になくなります。

※悪いことも気にならなくなるので気をつけましょう→筆者は特に!!

ポイントとしては、メソッドの中身が長くならないことです。筆者の理想としてはメソッドは20行以上にしたくありません。→努力いたします。

<処理概要>

  1. メインメソッド: (親クラス)Application.start()を実行
    2.start(): 親クラスのメソッドをオーバーライドします。テキストエリアを作成しコンテナ(javaFxの表示用格納庫)にテキストエリアを追加
    3. createTextArea(): テキストエリアを作成し、カーソルの位置を最後尾に移動します。
    4. createKeyPressEvent(): テキストエリアの入力時の操作を実装
  2. resetCursor(): カーソルを元の位置に戻します。※元の位置は、最後にキーを押した時の位置です。
  3. getCommand(): テキストエリアから全テキストを取得して最後の行にある「Cmd $ >」の文字列以降の部分を取得します。(コマンド)
  4. executeCommand(): 今回実装します。

    executeCommandの実装

    前回は、以下のような形で、入力文字を表示するところまで実装しました。

    /**
    * コマンドを実行します<BR/>
    * 登録したコマンドにない入力の時は<BR/>
    * エラーメッセージをテキストエリアに出力します。
    * @param command コマンド文字列
    */
    private void executeCmd(String command) {
    try {
        String className = bndle.getString(command);
        System.out.println("ClassName: " + className);
    } catch(Exception e) {
        e.printStackTrace();
    }
    }

    影に隠れて見づらいですが、「Properties: test」という文言が見えると思います。プロパティファイル上の方です。

    余談ですが、バグを発見 ※他にもあります。

    矢印キーでのカーソル移動は禁止しているのですが「バックスペース」削除ボタンは何もしていないので、下のように削除できてしまい。これ以降はコマンドを取得できなくなってしまいます。

なので追加設計を行います。

追加設計

「削除ボタン押下時にカーソルの位置が『Cmd $ >』に重なるような位置にいるか判定してから削除する。」の処理を追加します。
そして、コマンド実行後のカーソル位置を追加して、現在のカーソル位置とフィールド変数を二つ使用します。

/** 入力前のカーソル位置 */
private int currentPos;
/** 改行した時のカーソル位置 */
private int startCursorPos;

そして、修正した箇所になります。コンソール出力は気にしないでください。

if (KeyCode.LEFT.equals(evt.getCode())) {
    System.out.println("Sart: " + startCursorPos + " Current: " + currentPos + " getCaret: " + src.getCaretPosition());
    if (startCursorPos > src.getCaretPosition()) {
        // 左の矢印が押下された時
        src.positionCaret(currentPos);
    }
}
currentPos = src.getCaretPosition();

コマンドからクラスを取得する、準備1

コマンドで呼び出すクラスにCommandIFクラス(インターフェース)を実装します。

【インターフェース】

public interface CommandIF {
    public void execute();
}

【実装クラス】

public class UrlAccessor implements CommandIF {
    @Override
    public void execute() {
        System.out.println("Hello Command Interface!!");
    }
}

コマンドの実行部分

/**
 * コマンドを実行します<BR/>
 * 登録したコマンドにない入力の時は<BR/>
 * エラーメッセージをテキストエリアに出力します。
 * @param command コマンド文字列
 */
private void executeCmd(String command) {
    try {
        String className = bndle.getString(command);
        System.out.println("ClassName: " + className);
        // 完全クラス名よりクラスのインスタンスを取得する
        Class<?> cls = Class.forName(className);
        Constructor<?> cons = cls.getConstructor();
        CommandIF exe = (CommandIF) cons.newInstance();
        exe.execute();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

【プロパティファイル】文字だけだとわかりづらいので。。。

acc=jp.zenryoku.apps.UrlAccessor

【実行結果】

「Hello Command Interface!!」が表示されています。

長くなってしまいましたが。。。
以上、お疲れ様でした。


Java Basic GUI作成〜JavaFXを使用して画面を作る〜

イントロダクション

スタンドアロンでのJavaアプリケーションを作成します。
理由は、ウェブアプリケーションだとでかくなってしまい。Javaコードに集中できないからです。実際にJSPとかHTMLとか。。。作成することになるからです。
シンプルに、Javaのみで画面を作成し起動できるJavaFXでの実装を行います。今回の趣旨としては、JavaFXを使用して画面を作成するというところです・

実装したものはこんな感じです。

プログラムを作成する

コードはいたってシンプル ※作成物はこちら
下のようにjavafx.application.Applicationクラスを継承してlaunch()メソッドをオーバーライドするだけです。

public class CmdView extends Application {
    /** 画面の横サイズ */
    private static final int VIEW_WIDTH = 300;
    /** 画面のたてサイズ */
    private static final int VIEW_HEIGHT = 300;

    @Override
    public void start(Stage primary) {
        TextArea area = createTextArea();
        Group root = new Group();
        root.getChildren().add(area);
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primary.setScene(scene);
        primary.show();
    }

    /**
     * TextAreaを作成して返却する
     * @return TextArea
     */
    private TextArea createTextArea() {
        TextArea area = new TextArea();
        // 縦横の幅を設定する
        area.setPrefWidth(VIEW_WIDTH);
        area.setPrefHeight(VIEW_HEIGHT);
        area.setOnKeyPressed(createKeyPressEvent());

        return area;
    }

    private EventHandler<KeyEvent> createKeyPressEvent() {
        return new EventHandler<KeyEvent>() {
            public void handle(KeyEvent evt) {
                if (KeyCode.ENTER.equals(evt.getCode())) {
                    // Enter キーを謳歌した時の処理、テキストエリアを取得する
                    TextArea src = (TextArea) evt.getSource();
                    System.out.println("Press Enter: " + src.getText());
                }
                // チェック用のコンソール出力処理
                System.out.println("EventType: " + evt.getCode());
                System.out.println("Input: " + evt.getCharacter());
            }
        };
    }

    /** メインメソッド */
    public static void main(String[] args) {
        launch();
    }
}

Applicationクラスを拡張して作成します。

public class CmdView extends Application

メインメソッドは一番下で、親クラスのlaunchメソッドを呼び出すだけです。

/** メインメソッド */
public static void main(String[] args) {
    launch();
}

プログラムを起動したらメインメソッドが走ります。
その次に「launch()」が走るのですが、これは下のメソッド
start()を呼び出します。オーバーライドしてやるのでこのクラスのstartメソッドの処理が走ります。

ちなみに、フレームワークなどを作りたいときはこのような
「〜を継承して〜をオーバーライドすればOK」の形で作成します。
※手法の一つです。

@Override
public void start(Stage primary) {
    TextArea area = createTextArea();
    Group root = new Group();
    root.getChildren().add(area);
    Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
    primary.setScene(scene);
    primary.show();
}

TextAreaは下のprivateメソッドで作成しています。

/**
 * TextAreaを作成して返却する
 * @return TextArea
 */
private TextArea createTextArea() {
    TextArea area = new TextArea();
    // 縦横の幅を設定する
    area.setPrefWidth(VIEW_WIDTH);
    area.setPrefHeight(VIEW_HEIGHT);
    area.setOnKeyPressed(createKeyPressEvent());

    return area;
}

「public」は、外から呼べるメソッド
「private」は、このクラス内でのみ使用できる
こんな感じです。

ここから、画面の入力(コマンド)に対して処理を実行するように
修正していこうと思います。

Java Basic GUI作成〜コマンドを入力する〜

イントロダクション

前回は、カーソルを上下に移動しないように修正しました。
今回は、入力した文字を取得します。
入力した文字はコマンドとして使用したいので入力した文字列は「コマンド」と呼ぶことにします。

※作業としては中途半端になって終わっております。。。最終的にはテキストRPGの作成を行っております。

最終的にできたコードからみたほうが、わかりやすければ下の方に最終的に出来たコードがあります。

実装に関して

・テキストエリアからコマンドを取得する
・カーソルが「Cmd $ >」に被らないようにする

実装しているコードはGITにあります。

設計〜修正する場所〜

エンターキーを押下した時にコマンドを取得、実行する想定
なので、エンターキーを押下した時の処理を修正します。
下のコードでは赤くしている部分です。

前回までのコード

public class CmdView extends Application {
    /** 画面の横サイズ */
    private static final int VIEW_WIDTH = 300;
    /** 画面のたてサイズ */
    private static final int VIEW_HEIGHT = 300;
    /** コマンドの入力開始文字 */
    private static final String CMD_START = "Cmd $ ";
    /** 改行コード */
    private static final String LINE_SEPARETOR = System.getProperty("line.separator");
    /** 入力前のカーソル位置 */
    private int cursorPos;

    @Override
    public void start(Stage primary) {
        TextArea area = createTextArea();
        Group root = new Group();
        root.getChildren().add(area);
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primary.setScene(scene);
        primary.show();
    }

    /**
     * TextAreaを作成して返却する
     * @return TextArea
     */
    private TextArea createTextArea() {
        TextArea area = new TextArea();
        // 縦横の幅を設定する
        area.setPrefWidth(VIEW_WIDTH);
        area.setPrefHeight(VIEW_HEIGHT);
        area.setOnKeyPressed(createKeyPressEvent());
        // 初期表示文字を設定する
        area.setText("Hello user please input command!" + LINE_SEPARETOR + CMD_START);
        // テキストエリアの文字列数
        int textLen = area.getText().length();
        // 初期カーソル位置
        cursorPos = textLen;
        area.positionCaret(textLen);

        return area;
    }

    private EventHandler<KeyEvent> createKeyPressEvent() {
        return new EventHandler<KeyEvent>() {
            public void handle(KeyEvent evt) {
                // テキストエリアを取得する
                TextArea src = (TextArea) evt.getSource();
                // 入力を無効にする
                if (isDisabledInput(evt)) {
                    System.out.println("*** isDisable ***");
                    resetCursor(src);
                    return;
                }
                                
                if (KeyCode.ENTER.equals(evt.getCode())) {
                    // テキストエリア内の文字列を全て取得
                    String allText = src.getText();
                    // "Cmd $ "の文字列の位置を取得
                    int startPoint = allText.indexOf(CMD_START);
                }
                
                cursorPos = src.getCaretPosition();
                // チェック用のコンソール出力処理
                System.out.println("EventType: " + evt.getCode());
                System.out.println("Input: " + evt.getCharacter());
            }
        };
    }

    /**
     * キーボードより入力したキーで受け付けないものを<BR/>
     * 判定する
     * @param evt
     * @return true: 受け付けない入力  /  false: 受け付ける入力
     */
    private boolean isDisabledInput(KeyEvent evt) {
        boolean isDisable = false;
        // 入力許可キーのKeyCodeリスト
        List<KeyCode> acList = createAcceptList();

        // チェック処理: 入力禁止するキーの有無をチェック
        return acList.contains(evt.getCode());
    }
    /**
     * プロパティファイル、キーを指定して対象のプロパティを<BR/>
     * 取得する
     *
     * @param propNane プロパティファイル名
     * @param key プロパティのキー
     * @return プロパティの値
     */
    @Deprecated // 使用しないメソッド
    private String getTargetProperty(String propNane, String key) {
        String propStr = null;
        return propStr;
    }

    /**
     * チェック用のリストを作成して返却します<BR/>
     * 入力禁止のKeyCodeを追加
     * @return チェック用のリスト
     */
    private List<KeyCode> createAcceptList() {
        List<KeyCode> acList = new ArrayList<KeyCode>();
        acList.add(KeyCode.UP);
        acList.add(KeyCode.DOWN);

        return acList;
    }

    /**
     * カーソルの移動をしないようにします。
     * @param src
     */
    private void resetCursor(TextArea src) {
        // 始めのカーソル位置を設定する
        src.positionCaret(cursorPos);
    }

    /** メインメソッド */
    public static void main(String[] args) {
        launch();
    }
}

今回の追加修正する場所

・エンターキーを押下した時に入力した文字列を取得する
・エンターキーを押下した後に「Cmd $ >」を追加する
※実装済みなので修正しないが範囲に入るので。。。
・カーソルを横に動かした時に「Cmd $ >」に入らないようにする

追加したコード(抜粋)

修正した部分になりますが、テキストエリアの取得位置を変更

// テキストエリアを取得する
TextArea src = (TextArea) evt.getSource();

エントーキーを押下した時の処理を変更

if (KeyCode.ENTER.equals(evt.getCode())) {
    // テキストエリア内の文字列を全て取得
    String allText = src.getText();
    String command = getCommand(allText);
    src.setText(allText + CMD_START);
    // "Cmd $ "の文字列の位置を取得
    System.out.println("Command: " + command);
    cursorPos = allText.length() + CMD_START.length();
    src.positionCaret(cursorPos);
}

余計な処理になったので以下の処理を削除

// テキストエリアのカーソル位置をフィールド変数にセット
cursorPos = src.getCaretPosition();

左の矢印を入力した時のハンドル
(どのような振る舞いをするか?)をする処理を修正

if (KeyCode.LEFT.equals(evt.getCode())) {
    // 左の矢印が押下された時
    src.positionCaret(cursorPos);
}

最終的なコード

public class CmdView extends Application {
    /** 画面の横サイズ */
    private static final int VIEW_WIDTH = 300;
    /** 画面のたてサイズ */
    private static final int VIEW_HEIGHT = 300;
    /** コマンドの入力開始文字 */
    private static final String CMD_START = "Cmd $ >";
    /** 改行コード */
    private static final String LINE_SEPARETOR = System.getProperty("line.separator");
    /** 入力前のカーソル位置 */
    private int cursorPos;

    @Override
    public void start(Stage primary) {
        TextArea area = createTextArea();
        Group root = new Group();
        root.getChildren().add(area);
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primary.setScene(scene);
        primary.show();
    }

    /**
     * TextAreaを作成して返却する
     * @return TextArea
     */
    private TextArea createTextArea() {
        TextArea area = new TextArea();
        // 縦横の幅を設定する
        area.setPrefWidth(VIEW_WIDTH);
        area.setPrefHeight(VIEW_HEIGHT);
        area.setOnKeyPressed(createKeyPressEvent());
        // 初期表示文字を設定する
        area.setText("Hello user please input command!" + LINE_SEPARETOR + CMD_START);
        // テキストエリアの文字列数
        int textLen = area.getText().length();
        // 初期カーソル位置
        cursorPos = textLen;
        area.positionCaret(textLen);

        return area;
    }

    private EventHandler<KeyEvent> createKeyPressEvent() {
        return new EventHandler<KeyEvent>() {
            public void handle(KeyEvent evt) {
                // テキストエリアを取得する
                TextArea src = (TextArea) evt.getSource();
                // 入力を無効にする
                if (isDisabledInput(evt)) {
                    System.out.println("*** isDisable ***");
                    resetCursor(src);
                    return;
                }
                if (KeyCode.ENTER.equals(evt.getCode())) {
                    // テキストエリア内の文字列を全て取得
                    String allText = src.getText();
                    String command = getCommand(allText);
                    src.setText(allText + CMD_START);
                    // "Cmd $ "の文字列の位置を取得
                    System.out.println("Command: " + command);
                    cursorPos = allText.length() + CMD_START.length();
                    src.positionCaret(cursorPos);
                }
                if (KeyCode.LEFT.equals(evt.getCode())) {
                    // 左の矢印が押下された時
                    src.positionCaret(cursorPos);
                }
                // チェック用のコンソール出力処理
                System.out.println("EventType: " + evt.getCode());
            }
        };
    }

    /**
     * キーボードより入力したキーで受け付けないものを<BR/>
     * 判定する
     * @param evt
     * @return true: 受け付けない入力  /  false: 受け付ける入力
     */
    private boolean isDisabledInput(KeyEvent evt) {
        boolean isDisable = false;
        // 入力許可キーのKeyCodeリスト
        List<KeyCode> acList = createAcceptList();

        // チェック処理: 入力禁止するキーの有無をチェック
        return acList.contains(evt.getCode());
    }
    /**
     * プロパティファイル、キーを指定して対象のプロパティを<BR/>
     * 取得する
     *
     * @param propNane プロパティファイル名
     * @param key プロパティのキー
     * @return プロパティの値
     */
    @Deprecated // 使用しないメソッド
    private String getTargetProperty(String propNane, String key) {
        String propStr = null;
        return propStr;
    }

    /**
     * チェック用のリストを作成して返却します<BR/>
     * 入力禁止のKeyCodeを追加
     * @return チェック用のリスト
     */
    private List<KeyCode> createAcceptList() {
        List<KeyCode> acList = new ArrayList<KeyCode>();
        acList.add(KeyCode.UP);
        acList.add(KeyCode.DOWN);

        return acList;
    }

    /**
     * カーソルの移動をしないようにします。
     * @param src
     */
    private void resetCursor(TextArea src) {
        // 始めのカーソル位置を設定する
        src.positionCaret(cursorPos);
    }

    private String getCommand(String text) {
        String[] lines = text.split(LINE_SEPARETOR);
        String target = lines[lines.length - 1];
        return target.substring(CMD_START.length());
    }
    /** メインメソッド */
    public static void main(String[] args) {
        launch();
    }
}

以上のような形で実装してみました。
現状では、以下のような感じでコマンドの入力途中で
エンターキーを押下すると文字が中途半端に切れてしまいます。

そこの部分は次回修正したいそのうちに修正したいと思います。※多分やらないと思う。。。

でわでわ。。。