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を入れろという話のようですね。

UbuntuJavaFX開発環境を構築する
http://note.kurodigi.com/ubuntu-javafx/

Oracle JDK 8の場合はJavaFXを同梱していますので、JDK導入と同時にJavaFXが使える環境が整うのですが、OpenJDK 8にはJavaFXが含まれていないので別途導入する必要があります。

(中略)

Ubuntu 14.04LTSユーザーの方の現実的な解決方法は残念ながらOracle Java 8の導入ということになると思います。(ご自身でopenjfxをビルド出来る方は除きます)

では、Oracle JDKを入れてみます。

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すると、ちゃんと起動します。 では、日本語入力を……。

f:id:mokake:20151011114616p:plain

え?インライン入力できないの?

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で同様なものを作ってみると、日本語入力もインラインでできました。先は長い……。