【JavaFX】コントロールを初期化できないエラー
ボタンなどのコントロールを初期化しようとするとjava.lang.ExceptionInInitializerErrorというエラーが表示される、
Imageを初期化するとInternal graphics not initialized yetというエラーが出てしまう場合の対処法です。
このエラーで困ることはおそらくないと思うのですが、嵌まってしまって原因がなかなかつかめなかったのでメモ書き。
原因
Applicationクラスの外でjavafx.scene.control.Buttonなどのコントロールやjavafx.scene.image.Imageを初期化しようとするようです。
JavaFXのコントロールはApplicationの中で使うのが当然なのですが、私の場合、Swingで作ったアプリに、JavaFX楽天 のコントロールを使ったJframeを追加したときに発生しました。
エラーが発生するように超単純にサンプルプログラムを書くとこうなります。
package tomojavalib.fx;
import javax.swing.Jframe;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
public class FxFrame4 extends Jframe {
public FxFrame4(){
this.setBounds(50,50,320,240);
this.setBackground(java.awt.Color.WHITE);
Image image = new Image("file:D:test.png");
Button b = new Button("test");
JFXPanel fxPanel = new JFXPanel();
Group group = new Group();
group.getChildren().add(b);
Scene scene = new Scene( group );
fxPanel.setScene(scene);
this.add(fxPanel);
this.setVisible(true);
}
public static void main(String[] args) {
FxFrame4 f = new FxFrame4();
}
}
SwingのJframeを作り、その中で
Java
楽天 FXのコントロールを利用するためにjavafx.embed.swing.JFXPanelを置いています。
こうすることでjavafx.scene.control.ButtonなどのコントロールをSwing内で利用できるようになります。
解決方法
Image、Button、JFXPanelの順で初期化していますが、この順番を変えます。
Image image = new Image("file:D:test.png");
Button b = new Button("test");
JFXPanel fxPanel = new JFXPanel();
JFXPanelを先に初期化してしまえばエラーは発生しません。
JFXPanel fxPanel = new JFXPanel();
Image image = new Image("file:D:test.png");
Button b = new Button("test");
当初はJFXPanelを先に初期化していてエラーの発生はなかったのですが、いつの間にか入れ替わってしまい、原因がわからず悩みました。
最終更新日: 2017-07-14 05:14:36