Java ワンポイント ~コンソールをリフレッシュする~

イントロダクション

テキストRPGを作成中です。
コンソールのみで展開する仕様なので、コンソールのれふれっふ処理が必要になりました。

調べたので、アップしておきます。

Javaからコマンドを実行する

具体的には、コンソール画面(コマンドプロンプト(Win)やターミナル(Mac))でのコマンド実行をJavaプログラムから実行するということになります。

こちらのサイトを参考にすると、実行方法としては以下のようにコードを書きます。

Rumtime.getRuntime().exec(コマンド);

しかし、下のようなエラーが出ました。

java.io.IOException: Cannot run program "cls": CreateProcess error=2, 指定されたファイルが見つかりません。
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:621)
at java.lang.Runtime.exec(Runtime.java:451)
at java.lang.Runtime.exec(Runtime.java:348)
at jp.zenryoku.rpg.util.ConsoleUtils.clearConsole(ConsoleUtils.java:172)
at jp.zenryoku.rpg.TextRpgLogic.updateData(TextRpgLogic.java:115)
at jp.zenryoku.rpg.TextRpgGameEngine.start(TextRpgGameEngine.java:40)
at jp.zenryoku.rpg.GameMain.main(GameMain.java:16)
Caused by: java.io.IOException: CreateProcess error=2, 指定されたファイルが見つかりません。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init(ProcessImpl.java:444)at java.lang.ProcessImpl.start(ProcessImpl.java:139)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 7 more

EclipseからMainメソッドを起動した場合でした。

Fix

調べてみると下のようなコードでコンソールをクリアdできるようだ。

new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();

ただし、Eclipseではちゃんとクリアできないが、JARファイルから起動したときはちゃんとクリアされた。

関連ページ一覧

EclipseセットアップWindows版

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〜

JavaFX ワンポイント 〜Fontを指定する〜

TextFIeldやTextAreaを使用するときにFontの設定をしてやると大きさなど変更できます。

設定方法は以下のようなコードです。

newWindow = new Stage();
StackPane stack = new StackPane();
textArea = new TextArea();
textArea.setFont(Font.font("MS UI Gothic", FontWeight.BLACK, 19));
textArea.setOnKeyPressed(keyEvent -> {
    KeyCode code = keyEvent.getCode();
    if (keyEvent.isShiftDown() && KeyCode.SPACE.equals(code)) {
        newWindow.close();
        isTextIn = false;
    }
});
textArea.setOnKeyReleased(keyEvent -> {
    KeyCode code = keyEvent.getCode();
    if (keyEvent.isShiftDown() && KeyCode.ENTER.equals(code)) {
        textArea.setText("");
        textArea.positionCaret(0);
    }
});
stack.getChildren().add(textArea);
Scene scene = new Scene(stack, 450, 100);
newWindow.setScene(scene);
newWindow.initModality(Modality.WINDOW_MODAL);
newWindow.initOwner(primary);
newWindow.setX(primary.getWidth() * 0.4);
newWindow.setY(primary.getHeight() * 0.8);
newWindow.show();

return newWindow;

TextAreaで実装しましたが、これはTextFieldにも使用できます。

でわでわ。。。



関連ページ一覧

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リポジトリからクローン〜

JavaFX ワンポイント 〜新しいWindowを立ち上げる〜

JavaFXを起動するときにすでにウィンドウを1つ起動していますが、さらにウィンドウを使いたいとき。。。

今回はそんなところを「ワンポイントレッスン」的に記載したいと思います。

ちなみに、JavaFXはこんな感じのものです。余計な音が入っています。そして、文言を表示する部分でnewWindowを使用しています。

ウィンドウを新しく作る

WindowはStageです。なので、下のように実装したらできました。
参考にしたサイトはこちらです。

private Stage createNewWindow(Stage primary) {
    newWindow = new Stage();
    StackPane stack = new StackPane();
    textArea = new TextArea();
    textArea.setOnKeyPressed(keyEvent -> {
        KeyCode code = keyEvent.getCode();
        if (keyEvent.isShiftDown() && KeyCode.SPACE.equals(code)) {
            newWindow.close();
            isTextIn = false;
        }
    });
    textArea.setOnKeyReleased(keyEvent -> {
        KeyCode code = keyEvent.getCode();
        if (keyEvent.isShiftDown() && KeyCode.ENTER.equals(code)) {
            textArea.setText("");
            textArea.positionCaret(0);
        }
    });
    stack.getChildren().add(textArea);
    Scene scene = new Scene(stack, 250, 50);
    newWindow.setScene(scene);
    newWindow.initModality(Modality.WINDOW_MODAL);
    newWindow.initOwner(primary);
    newWindow.setX(primary.getWidth() * 0.4);
    newWindow.setY(primary.getHeight() * 0.8);
    newWindow.show();

    return newWindow;
}

作成したウィンドウにキーイベントを追加して見ました。

ちなみに、
簡単ですが、こんな感じで。。。

でわでわ。。。



関連ページ

関連ページ一覧

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 OpenCV エラーの対処 〜CvException /matrix.cpp:465: 〜

Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.3) /opencv/modules/core/src/matrix.cpp:465: error: (-215:Assertion failed) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function 'Mat'
]
at org.opencv.core.Mat.n_submat(Native Method)
at org.opencv.core.Mat.submat(Mat.java:854)
at zenryokuservice.opencv.fx.ImageSlicerMain.loadImg(ImageSlicerMain.java:78)
at zenryokuservice.opencv.fx.ImageSlicerMain.main(ImageSlicerMain.java:107)

このエラーメッセージに、遭遇したら単純に、読み込んだファイルのサイズと読み込もうとしているサイズの指定がうまくいっていません。指定するサイズが不適切な感じです。

自分の実装したコードは下の様なものです。

URL p = this.getClass().getResource("/" );
System.out.println("*** " + p.getPath());
Mat downloadFile = Imgcodecs.imread(p.getPath());


自分の場合は上のようなコードで、リソース(ファイル)が取得できていませんでした。それゆえにエラー。

下の部分はデバッグ用に実装した部分です。取得したパスの確認をしました。

System.out.println("*** " + p.getPath())

Class#getResource()とnew File(パス)で実装する時にルートになる場所が変わるので注意が必要です。

作成したImageSlicerでイメージファイルを切り刻みます。
ソースコードは、こちらに有ります

ポイントは、ループする最中に、xPosとyPosで切り出すファイルの位置をづらしていくところです。
そして、確認用のSwingは最後に出力するイメージが表示されます。。。

private ImageIcon dstImage(String fileName, Mat downloadFile, String sufix, int xPos, int yPos, int size, int times) {
    Rect roi = new Rect(xPos, yPos, size, size);
    System.out.println("x: " + roi.x);
    System.out.println("y: " + roi.y);
    Mat target = downloadFile.submat(roi);
    MatOfByte bytes = new MatOfByte();
    Imgcodecs.imencode(".png", target, bytes);
    byte[] b = bytes.toArray();
    InputStream in = new ByteArrayInputStream(b);
    BufferedImage buf = null;
    try {
        buf = ImageIO.read(in);
        File out = new File("resources/dst/" + fileName + "_" + sufix + ".png");
        ImageIO.write(buf, "png", out);
    } catch(IOException e) {
        e.printStackTrace();
    }
    return new ImageIcon(buf);
}


javapackager コマンドエラー〜PackagerException: 無効なディレクトリ〜

イントロダクション

JavaFXをブラウザから起動しようとしてブラウザにJavaを埋め込むために下のサイトを参考にしました。そして…

https://stackoverflow.com/questions/27958019/embed-a-javafx-application-in-a-html-webpage

こっちは試してないが、載せときます。

https://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm

以下のエラーにぶつかりました。

実行したこと

Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: 無効なディレクトリ~/git/MathKitJavaFX/MathKitJavaFX/bin

at com.sun.javafx.tools.packager.Main.main(Main.java:217)

 実行したコマンドは以下のものです。

javapackager -createjar -outdir compiled -outfile myapp -appclass zenryokuservice.fx.tutorial.download.Xylophone -srcdir bin -v

解決

しかしこれは、mac + eclipse(自分の環境)では不要でした。

シンプルに次のコマンドで出力することができました。

javapackager -deploy -outdir deployed -outfile TestApp -width 600 -height 600 -name Xylophen -appclass zenryokuservice.fx.tutorial.download.Xylophone -v -srcdir compiled

出力結果は以下のようになりました。出力したファイルは「TestApp.html」と「TestApp.jnlp」です。

追伸:プロジェクト直下に「compiled」フォルダを作成しています。

でわでわ。。。