JavaFX内におけるAWT/Swingの使いどころ
JavaFXを使えば、AWT/Swingはもうお役御免じゃね?と思われるが、ちょっとしたことにおいてはまだまだ使う。
特に、JDK1.6で追加されたデスクトップ機能はよく使ったりするので、メモとして残しておく。
OS標準のアプリケーションでファイルを開く
- 拡張子が関連付けられたOS標準のアプリケーションでファイルを開くときには、「Desktop#open(<ファイル>)」「Desktop#edit(<ファイル>)」を使用する
- メソッド「open()」と「edit()」の違いは環境によって異なると思うが、試した見た限りだと次の通り。
- open()は、現状、関連付けられているアプリケーションで開く。OSで関連付けられていればなんでも開ける。Excel、Word、textなど。TXTファイルを開くと、自分はSakuraエディタを関連付けに変更しているのでそれが開く。
- edit()は、OS標準のエディタで開く。開けない拡張子があるため、open()で開くのが無難。TXTファイルを開くと、OS標準のワードパットで開いた。
import java.awt.Desktop; import java.io.File; import java.io.IOException; final File file = new File("c:/sample.xls"); final Desktop = new Desktop.getDesktop(); try { // 関連付けられたアプリケーションを起動してファイルを開きます。 desktop.open(file); // 関連付けられたエディタアプリケーションを起動して、ファイルを編集用に開きます。 desktop.edit(file); } catch(IOExeption e) { //TODO }
ビープ音を鳴らす
ダイアログを開くときにビープ音を鳴らして、ユーザに知らせたいときに使用する。
// ビープ音を鳴らす。 import java.awt.Toolkit; Toolkit.getDefaultToolkit().beep();
ちなみに、JavaFXで音楽を流すのには、「javafx.scene.media.MediaPlayer」を利用する。
ただし、ビープ音とは異なり、JavaFXのアプリケーション(正しくは、JavaFXのスレッド)の中だけでしか利用できない。
ビープ音ならば、別にJava内のどこであってもならせる。
import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; // JavaFXでの音楽を鳴らす private void playSound() { Media sound = new Media(getClass().getResource("sample.mp3").toExternalForm()); MediaPlayer mp = new MediaPlayer(sound); mp.play(); }
メッセージボックスを開く(JOptionPane)
JavaFXでは標準のダイアロ表示機能はないが、OSSとして「jfxmessagebox」が公開されており、Swingの「JOptionPane」とほぼ同じ使い勝手で使える。
ただし、Application#init()中の場合など、JavaFXの初期化が終わっていない段階では使えない。
「JOptionPane」の使いどころとしては、Application#init()中でエラーが発生した際にメッセージボックスを表示したいときなど。
当然、JavaFXのどこでもJOptionPaneは使えるが、デザインが異なり違和感があるので、最低限の部分にとどめておくのが無難だと思われる。
http://sourceforge.jp/projects/jfxmessagebox/
import java.awt.Toolkit; import javax.swing.JOptionPane; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SampleApplication extends Application { /** Sprignのコンテキスト */ private ApplicationContext applicationContext; /** * Springの初期化 */ @Override public void init() { try { //Springのコンテナの初期化 applicationContext = new ClassPathXmlApplicationContext("/ApplicationContext.xml"); } catch(Throwable e) { // ビープ音を鳴らす Toolkit.getDefaultToolkit().beep(); // ★Swingによるダイアログの表示 JOptionPane.showMessageDialog(null, "起動中にエラーが発生しました。アプリケーションを終了します。\n" + e.getMessage(), "起動エラー", JOptionPane.ERROR_MESSAGE); System.exit(1); } } @Override public void start(final Stage primaryStage) throws IOException { //TODO: 画面の組み立て // ステージの表示をフォーカスを充てる primaryStage.show(); primaryStage.requestFocus(); } @Override public void stop() throws Exception { // Springのコンテナの終了 if(applicationContext instanceof AbstractApplicationContext) { ((AbstractApplicationContext) applicationContext).close(); System.out.println("close"); } } public static void main(String[] args) { launch(args); } }