イントロダクション
前回は、コマンド画面の入力チェック部分を作成しました。
今回は、入力チェックに引っかかった場合の処理を実装します。
設計
入力チェックに引っかかった場合、何も実装していないと
カーソルは移動してしまうので、それを動かないように修正します。
・入力した時点でのカーソルの位置を取得する
・入力したキーが入力禁止の場合にカーソルの位置を戻す
※上下のボタンを押下した時に移動しないようにする
しかし、中途半端になっているのが現状です。動きとしては下のような感じで動きます。
前回のソースコード
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");
@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();
area.positionCaret(textLen);
return area;
}
private EventHandler<KeyEvent> createKeyPressEvent() {
return new EventHandler<KeyEvent>() {
public void handle(KeyEvent evt) {
// 入力を無効にする
if (isDisabledInput(evt)) {
System.out.println("*** isDisable ***");
return;
}
if (KeyCode.ENTER.equals(evt.getCode())) {
// Enter キーを謳歌した時の処理、テキストエリアを取得する
TextArea src = (TextArea) evt.getSource();
// テキストエリア内の文字列を全て取得
String allText = src.getText();
// "Cmd $ "の文字列の位置を取得
int startPoint = allText.indexOf(CMD_START);
}
// チェック用のコンソール出力処理
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 プロパティの値
*/
@Depulicated // 使用しないメソッド
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;
}
/** メインメソッド */
public static void main(String[] args) {
launch();
}
}
今回の追加修正する場所
上のコードに修正するメソッドを赤文字に変更してあります。
そして、入力したキーが入力禁止の場合の処理(メソッド)を追加します。
追加したコード(抜粋)
// 初期カーソル位置 cursorPos = textLen; // 入力を無効にする resetCursor(src); /** * カーソルの移動をしないようにします。 * @param src */ private void resetCursor(TextArea src) { // 始めのカーソル位置を設定する 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(); // "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(); } }
赤色の部分を追加で修正しました。
修正した行はコメントの方が多かったですが。。。
こんな感じです。
基盤になるコードを追加してどんどん成長させるのも
面白いですね。
でわでわ。。。