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の評価機能を組み込んだ対話型ツールを構築できます。
-
JavaとOpenCVでガウシアンブラー(ガウスぼかし)を実装する方法を徹底解説
画像にローパスフィルタを適用してフィルタリングを行うことで、画像をぼかすことができます。この処理により、ノイズやエッジといった高周波成分が画像から取り除かれます。ガウシアンブラー(Gaussian Blurring:ガウスぼかし)は、OpenCVが提供するぼかし手法のひとつで、画像のノイズ除去に非常に高い効果を発揮します。この手法では、カーネル領域内のすべてのピクセルの平均値を使って、中心の要素を置き換えます。GaussianBlur()メソッドの使い方この手法で画像をフィルタリング・ぼかし処理するには、GaussianBlur()メソッドを使用します。このメソッドは以下の引数を受け取ります。
-
JavaとOpenCVでブラー(平均化)フィルタを実装する方法を解説
画像にブラー(ぼかし)処理を加えるには、ローパスフィルタを使って画像をフィルタリングします。これにより、画像から高周波成分(ノイズやエッジなど)が除去されます。 平均化(Averaging)は、OpenCVが提供するぼかし手法のひとつです。カーネル領域内のすべてのピクセルの平均値を計算し、その値で中心のピクセルを置き換えることで、画像全体を滑らかにぼかします。 この手法で画像をフィルタリング・ぼかし処理するには、blur() メソッドまたは boxFilter() メソッドを使用します。blur() メソッドは、以下の引数を受け取ります。 ソース画像と出力先画像を表す2つの Mat オブジェ