JavaでGUIアプリケーションを作りたい (1)
動機
Linux上でGUIアプリケーションを動かしたいのです。Androidにもコードの一部を流用したいので、言語はJava。
いまどきのJava GUIといえば、JavaFXでしょうか。XMLで画面を定義する、いわゆる「流行りのスタイル」。数か月前に待望のダイアログもついたし、そろそろ使えそうですよね。
JavaFXを試してみる
おもむろにOracleからデモをダウンロード。ファイル容量が小さなマンデルブローのデモを実行(ちなみにLinux Mint 17.1 MATEです)。
$ java -jar MandelbrotSet.jar
エラー: メイン・クラスdemo.parallel.Mainが見つからなかったかロードできませんでした。
あれ?たしかOpenJDKは8にしたはず。
$ java -version openjdk version "1.8.0_45-internal" OpenJDK Runtime Environment (build 1.8.0_45-internal-b14) OpenJDK Server VM (build 25.45-b02, mixed mode)
最新から見たら少し古いけど、十分新しいと思うのですが。
どうやら、ppa追加で入るOpenJDKだと、JavaFXが入ってないらしいです。自前でビルドすればいいって言われても、そんなの他人には求められないし。
どうやら、現実的には、Oracle JDKを入れろという話のようですね。
UbuntuにJavaFX開発環境を構築する
http://note.kurodigi.com/ubuntu-javafx/
Oracle JDK 8の場合はJavaFXを同梱していますので、JDK導入と同時にJavaFXが使える環境が整うのですが、OpenJDK 8にはJavaFXが含まれていないので別途導入する必要があります。
(中略)
Ubuntu 14.04LTSユーザーの方の現実的な解決方法は残念ながらOracle Java 8の導入ということになると思います。(ご自身でopenjfxをビルド出来る方は除きます)
UbuntuにJava8環境構築 - Qiita
http://qiita.com/ayihis@github/items/01f95d5d465168043ae3
$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java8-installer $ sudo apt-get install oracle-java8-set-default
これで、無事MandelbrotSetは動きました。
では、次にメモ帳もどき、というか、単にTextAreaをはりつけただけのものを作ってみます。 いえ、単にNetBeansのデフォルトテンプレートをいじっただけですが。
package javafxapplication2; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TextArea; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class JavaFXApplication2 extends Application { @Override public void start(Stage primaryStage) { TextArea txt = new TextArea(); StackPane root = new StackPane(); root.getChildren().add(txt); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("TextArea"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
java -jar JavaFXApplication2.jarすると、ちゃんと起動します。 では、日本語入力を……。
え?インライン入力できないの?
JavaFXやSwingではFcitxでインライン入力できない?
別途Swingでも試してみました。
結果として、JavaFXとSwingの両方で、Mint17.1とFcitxの組み合わせでは日本語インライン入力はできないようでした。
ちなみにスクリーンショットはMozcですが、Anthyでも結果は変わりません。既にUbuntuがFcitxに移行している中で、これは厳しい……。
2016-12-02追記
すみません。XIMを有効にすればJavaFXもSwingもインライン入力できました。お詫びします。
第3の選択肢
やはり独自にGUIを作っていると、こういうトラブルが起きうると考えたほうがよさそうですね。
それなら、ネイティブなGUIを使えばいいはず。
Standard Widget Toolkit - Wikipedia
https://ja.wikipedia.org/wiki/Standard_Widget_Toolkit
SWTで同様なものを作ってみると、日本語入力もインラインでできました。先は長い……。