承認これくしょん

my black histories

Nashorn + JavaFXでQRコードを表示する

Java 8から新しいJavaScriptエンジンであるNashornが同梱されています。
実行シェルであるjjsでは、-fxオプションを使うと簡単にJavaFXアプリケーションが作成できます。
これを使って、コマンドライン引数の値でQRコードを生成して表示するスクリプトを書きました。

実行方法

ZXingライブラリを使用しています。Mavenリポジトリから各jarをダウンロードしてください。

  • core-3.2.0.jar
  • javase-3.2.0.jar

それぞれスクリプトと同じディレクトリに配置し、以下のコマンドで実行します。

jjs -cp core-3.2.0.jar;javase-3.2.0.jar -fx qr.js -- (QRコードの内容)

ソース (qr.js)

var Hashtable = java.util.Hashtable;

var ImageView = javafx.scene.image.ImageView;
var StackPane = javafx.scene.layout.StackPane;
var Scene = javafx.scene.Scene;
var SwingFXUtils = javafx.embed.swing.SwingFXUtils;

var EncodeHintType = com.google.zxing.EncodeHintType;
var ErrorCorrectionLevel = com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
var QRCodeWriter = com.google.zxing.qrcode.QRCodeWriter;
var BarcodeFormat = com.google.zxing.BarcodeFormat;
var MatrixToImageWriter = com.google.zxing.client.j2se.MatrixToImageWriter;

var content = arguments[0]; // コマンドライン引数
var width = 230;
var height = 230;

function start(stage) {
  if (content) {
    // エンコード設定
    var encodeHint = new Hashtable();
    encodeHint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    // QRコード生成
    var writer = new QRCodeWriter();
    var bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, encodeHint);
    var img = SwingFXUtils.toFXImage(MatrixToImageWriter.toBufferedImage(bitMatrix), null);
    // ウインドウに表示
    stage.title = content;
    var root = new StackPane();
    var imageView = new ImageView(img);
    root.children.add(imageView);
    stage.scene = new Scene(root, width, height);
    stage.show();
  } else {
    exit(); // 引数が無ければ終了
  }
}

javafx.application.Applicationを継承せずにサクッと作れます。
あらかじめ用意されているユーティリティを使えば、昔ながらのBufferedImageも表示できます。

参考