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 GUI作成 〜プロパティファイルを読む〜

イントロダクション

前回、クローリングについて学びました。
今回は、フレームワークなどを使用しないでウェブにアクセスしてみようと思います。

前回までの実装

Applicationクラスを拡張して、下のような画面を作成する準備をした。最終的には、コマンドを実行する画面を作成しました。この画面を作成するためのコード解説をしています。

この記事の状態としては、画面の表示ができて、下のような文字が表示できている状態です。

Hello user please input command!
Cmd $ >hello
---------------------------------
   * * **    * * *      * * * *
   *     *   *     *  *         *
   *     *   *     * *           *
   * * *     * * *   *
   *    *    *        *     * * *  
   *     *   *          * * * *
   *       * *                *
---------------------------------
  *** push start or continue ***
      start: s     continue: c

---------------------------------

Cmd $ >

この時点で、

やってみること

・フレームワーク(外部のJar)などを使用せずにJDKに含まれているパッケージを使用して実装する。
・作成中のGUIの「CmdView」でコマンドを入力して起動するように追加修正する

設計

<要件>
・指定したURLにアクセスする実装は「UrlAccessor」クラスに任せる
・起動と結果の表示は「CmdView」クラスで行う

<実装部分>
・新規で「UrlAccessor」クラスを作成する
・「CmdView」クラスに「acc」コマンドが入力された時にgoogleの検索画面にアクセスする
追加修正する場所

処理としては、以下のようになります。

  1. コンストラクタで画面を生成するときに、「CmdCls.properties」を読込む処理の実装
  2. キーと値をセットにしているファイルを作成する
  3. 「hello」コマンド(前回作成済み)と「acc」コマンドを作成する

前回までのコード

    /**
     * イベント処理を行うクラスを生成<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.LEFT.equals(evt.getCode())) {
                    System.out.println("Sart: " + startCursorPos + " Current: " + currentPos + " getCaret: " + src.getCaretPosition());
                    if (startCursorPos > src.getCaretPosition()) {
                        // 左の矢印が押下された時
                        src.positionCaret(currentPos);
                    }
                }
                currentPos = src.getCaretPosition();
                // チェック用のコンソール出力処理
                System.out.println("EventType: " + evt.getCode());
            }
        };
    }

CmdView

コマンドを実行する為のメソッドを追加

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);
}

コマンドを実行する為のキーとプロパティを作成

<フィールドにプロパティファイル名(パス)>

/** プロパティファイル名 */
private static final String CMD_PROPERTY = "CmdCls";
/** リソースバンドル */
private ResourceBundle bndle;

<プロパティファイルのロード>

// プロパティファイルのロード
bndle = ResourceBundle.getBundle(CMD_PROPERTY);
System.out.println("Properties: " + bndle.getString("acc"));
/**
 * コマンドを実行します<BR/>
 * 登録したコマンドにない入力の時は<BR/>
 * エラーメッセージをテキストエリアに出力します。
 * @param command コマンド文字列
 */
private void executeCmd(String command) {
     // この部分は次回作成します。
}

まとめ

表示したコマンド画面に、入力した値(文字列)から「コマンド」部分を切り出してコマンドを取得する「getCommand()」を作成思案した。

コマンドの実装部分は次回ということで
でわでわ。。。

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 network 〜クローリング〜

イントロダクション

前回作成した、コマンド画面で入力した文字を…
つまり、画面を作り、コマンドプロンプトのコマンド実行の結果を取得することこまで実装しました。

とりあえず、キリの良いところまで、実装できました。現状何をするのか決まっていませんが、インターネット検索を行い必要な情報を取得する機能が欲しいと思っている所ですので、クローリングに挑戦したいと思います。

クローリング

クローリング…筆者もよくわかっていないので調べます。
以下のステップで検索して、結果を出します。

1. Googleの検索テキストボックスに文字列を入力する
2. 適当なサイトの中身を読み記載内容を自分の中でまとめます。
3. まとめた内容から理解します。
※「理解する」というのが抽象的ですので「〜はXXXをする○○○である」というふうに情報を
  整理することを指し示す事とします。

そして、自分が調べてみた所

「クローリングとは、ウェブサイトに辿り着く→ 解析 →リンクを辿る処理を繰り返し行うプログラムのこと」という結果が出ました。

参考にしたサイトは以下のサイトです。
https://nandemo-nobiru.com/3661/#0102

理想と現実

なんでも「こーだったらいいな」っていう事と「実際にできることは、ここまでだよね」っていう事があると思います。
その通りだと思います。ならば「こーだったらいいな」に近づけるために「実際こーだよね」っていうことを掘り下げます。
つまり、理想と現実を並べてみて現状、どの部分からなら着手できるかを探します。

やってみましょう(プログラム初心者の場合)

理想は、クローリングを実装してウェブ上から欲しい情報を取得、まとめた形でレポートを作成し、それを出力して自分が確認できる事。
現状は、すでにあるフレームワーク(ライブラリやツール)を使う為の勉強と実装を行っていく事が一番の早道になると思います。
でわ、ライブラリやフレームワークを探します。
そして、Javaをメインにやっているので以下の4点を見つけました。
参照サイトはこちらになります。
・jsourp
・crowler4j
・Apache Tika
・Apache Nutch

フレームワークは何を使う?

ぶっちゃけてなんでも良いと思います。筆者は自分で作成しようかと思っていました。が書いている最中に「初心者向けに。。。」と考えたらフレームワークの方が良いのではないかと思った次第です。
しかし、フレームワークだろうが、なんだろうがJavaを使用している限りはJDKを使用してるので自分で作る方向で行きましょう。というわけで

結論、corwler4jを使用しよう

Gitにありました。「corwler4j

次回は、このページを勉強してみようと思います。

クローラー4Jを使う

上記のGithubのページを見てみると、使い方がコードも一緒に載っています。
使い方をみると以下のようになっていました。

1.インストール

Mavenを使用する方法と、Gradleを使用する方法がありました。
Mavenを使用する場合は、以下の依存関係、タグをPOMファイルに追加します。dependenciesタグの中に追加します。

ちなみにMavenをメインで使っているのでGradleは、ほぼ使ってません。すいません。。。

    <dependency>
        <groupId>edu.uci.ics</groupId>
        <artifactId>crawler4j</artifactId>
        <version>4.4.0</version>
    </dependency>

Gradleは以下のようにやります。これもコードを追加するだけです。

compile group: 'edu.uci.ics', name: 'crawler4j', version: '4.4.0'

2.実装

Githubにあるプログラムを拡張して使用する形でクローラーを作成するという作業が必要です。
ズバリ、以下のような手順を踏むように記述がありました。

  1. WebCrawlerクラスを継承する
    • shouldVisitメソッドのオーバーライド
    • visitメソッドのオーバーライド
  2. 上記のクローラーを起動する
    • シードページなどを設定(コンストラクタで引数に渡す)

これで行けるようです。現在作成中のテキストRPGの実装後に実装ってみたいと思います。

次回は、JDKに含まれているjavaパッケージを使用しようと思います。
でわでわ。。。

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();
    }
}

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

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

でわでわ。。。