Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9でJavaFXを使ってJShellをプログラムから実装する方法

JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。

import jdk.jshell.JShell;
import jdk.jshell.SnippetEvent;
import jdk.jshell.VarSnippet;

これらのクラスの役割は次のとおりです。

  • JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。
  • SnippetEvent:評価結果として発生するイベント。スニペットの状態や値を保持します。
  • VarSnippet:変数宣言のスニペットを表すクラス。型名や変数名を取得できます。

実装例:JavaFXアプリケーションでJShellを動かす

以下の例では、簡単なJavaFXアプリケーションを実装しています。テキストフィールドに任意の式や変数宣言を入力し、「eval」ボタンを押すと、JShellがその入力を評価します。評価された値は、対応するデータ型とともにリスト(ListView)に表示されます。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.util.List;
import jdk.jshell.JShell;
import jdk.jshell.SnippetEvent;
import jdk.jshell.VarSnippet;

public class JShellFXTest extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        // JShellインスタンスを生成
        JShell shell = JShell.builder().build();
        TextField textField = new TextField();
        Button evalButton = new Button("eval");
        ListView<String> listView = new ListView<>();

        evalButton.setOnAction(e -> {
            // テキストフィールドの内容をJShellで評価
            List<SnippetEvent> events = shell.eval(textField.getText());
            events.stream().map(event -> convert(event)).filter(s -> s != null).forEach(s -> listView.getItems().add(s));
        });
        BorderPane pane = new BorderPane();
        pane.setTop(new HBox(textField, evalButton));
        pane.setCenter(listView);
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    // SnippetEventを表示用の文字列に変換
    public static String convert(SnippetEvent e) {
        if(e.snippet() instanceof VarSnippet) {
            return ((VarSnippet) e.snippet()).typeName() + " " + ((VarSnippet) e.snippet()).name() + " " + e.value();
        }
        return null;
    }
    public static void main(String[] args) {
        launch();
    }
}

コードのポイント

  • JShell.builder().build() でJShellのインスタンスを作成します。
  • ボタンが押されると、shell.eval() に入力文字列を渡して評価を行い、結果を List<SnippetEvent> として受け取ります。
  • convert() メソッドでは、結果が VarSnippet(変数宣言)の場合にのみ、「型名 変数名 値」の形式の文字列に変換してListViewに追加します。

実行結果

アプリケーションを起動すると、テキストフィールドに例えば「int x = 10」のような変数宣言を入力して「eval」ボタンを押すことで、リストに「int x 10」という形式で評価結果が表示されます。このように、GUI上で手軽にJShellの評価機能を組み込んだ対話型ツールを構築できます。

  1. JavaとOpenCVでガウシアンブラー(ガウスぼかし)を実装する方法を徹底解説

    画像にローパスフィルタを適用してフィルタリングを行うことで、画像をぼかすことができます。この処理により、ノイズやエッジといった高周波成分が画像から取り除かれます。ガウシアンブラー(Gaussian Blurring:ガウスぼかし)は、OpenCVが提供するぼかし手法のひとつで、画像のノイズ除去に非常に高い効果を発揮します。この手法では、カーネル領域内のすべてのピクセルの平均値を使って、中心の要素を置き換えます。GaussianBlur()メソッドの使い方この手法で画像をフィルタリング・ぼかし処理するには、GaussianBlur()メソッドを使用します。このメソッドは以下の引数を受け取ります。

  2. JavaとOpenCVでブラー(平均化)フィルタを実装する方法を解説

    画像にブラー(ぼかし)処理を加えるには、ローパスフィルタを使って画像をフィルタリングします。これにより、画像から高周波成分(ノイズやエッジなど)が除去されます。 平均化(Averaging)は、OpenCVが提供するぼかし手法のひとつです。カーネル領域内のすべてのピクセルの平均値を計算し、その値で中心のピクセルを置き換えることで、画像全体を滑らかにぼかします。 この手法で画像をフィルタリング・ぼかし処理するには、blur() メソッドまたは boxFilter() メソッドを使用します。blur() メソッドは、以下の引数を受け取ります。 ソース画像と出力先画像を表す2つの Mat オブジェ