ControlsFX の Dialog を試してみた。
JavaFX には標準で Dialog Box が無い!
なんで無いのかは解らないけど JavaFX 8 なら外部ライブラリーの ControlsFX の Dialog が使えるようです。
ちょっと試してみました。
リストから選択された Dialog を表示させて Dialog での処理をテキストエリアに表示させるだけのシンプルなプログラムです。
こんな感じで動きました。
かなり良い感じの Dialog Box になってます。
ただ、Font Dialog は標準出力に勝手に表示されます。デバッグ用のが残ってるんでしょうか?
それと気になるのは Choice Input Dialog でデフォルトを設定した場合、デフォルト選択のまま Ok ボタンを押すと null が返されるのは何故なんだろう?
私的に少し馴染めない仕様になってるところがあるのでちょっと注意が必要です。
それでは Java 8 環境が必要ですがこのプログラムのコードと Java Web Start を貼っておきますね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package jp.yucchi.trycontrolsfx_dialog; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; /** * * @author Yucchi */ public class TryControlsFX_Dialog extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setTitle("ControlsFX の Dialog Box"); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
package jp.yucchi.trycontrolsfx_dialog; import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.ListView; import javafx.scene.control.MultipleSelectionModel; import javafx.scene.control.TextArea; import javafx.scene.text.Font; import org.controlsfx.control.action.Action; import org.controlsfx.dialog.Dialogs; import org.controlsfx.dialog.Dialogs.CommandLink; /** * * @author Yucchi */ public class FXMLDocumentController implements Initializable { @FXML private ListView<String> listView; @FXML private TextArea textArea; private Font font; @Override public void initialize(URL url, ResourceBundle rb) { MultipleSelectionModel<String> model = listView.getSelectionModel(); model.selectedItemProperty().addListener((ObservableValue<? extends String> value, String oldValuet, String newValue) -> { textArea.appendText(oldValuet + " to " + newValue + "\n"); if (model.getSelectedItems().get(0).toString() != null) { switch (model.getSelectedItems().get(0).toString()) { case "Information": Dialogs.create() .owner(listView.getScene().getWindow()) .title("JavaFX") .masthead(isMastheadVisible() ? "ControlsFX" : null) .message("ControlsFX による Information Dialog Box です。") .showInformation(); textArea.appendText("OK\n\n"); // 戻り値無し break; case "Confirmation": Action response = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Confirmation") .masthead(isMastheadVisible() ? "あなたの好みは?" : null) .message("あなたは巨乳が好きですか?") .showConfirm(); textArea.appendText(response.toString() + "\n\n"); break; case "Warning": Action responseWarning = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Warning") .masthead(isMastheadVisible() ? "やる気がなくなってきました。" : null) .message("Ok ボタンをクリックしてやる気を補充してください。") .showWarning(); textArea.appendText(responseWarning.toString() + "\n\n"); break; case "Error": Action responseError = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Error") .masthead(isMastheadVisible() ? "エラーです。" : null) .message("小さいことは気にせず、おおらかな心で対処しましょう!") .showError(); textArea.appendText(responseError.toString() + "\n\n"); break; case "Exception": Action responseException = null; try { responseException = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Exception") .masthead(isMastheadVisible() ? "例外発生しました。" : null) .message("気になるならスタックトレースでもご覧になってください。") .showException(Exception.class.newInstance()); } catch (InstantiationException | IllegalAccessException ex) { Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex); } textArea.appendText(responseException.toString() + "\n\n"); break; case "Text Input": String responseTextInput = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Text Input") .masthead(isMastheadVisible() ? "あなたのお名前を入力してね♡" : null) .message("あなたのお名前は?") .showTextInput(); textArea.appendText(responseTextInput + "\n\n"); break; case "Choice Input": List<String> items = Arrays.asList("Java", "Haskell", "C++", "PHP", "日本語"); String responseChoiceInput = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Coice Input") .masthead(isMastheadVisible() ? "あなたの好みは?" : null) .message("あなたの好きな言語を選んでください。") // .showChoices(items.get(0), items); // デフォルトを選択状態で Ok だとぬるぽだよ。 .showChoices(items); // 何も選択しない状態で Ok だとぬるぽ。(これは解る) textArea.appendText(responseChoiceInput + "\n\n"); break; case "Command Link": List<CommandLink> links = Arrays.asList( new CommandLink("プログラムを終了します。", "未保存のデータは破棄されます。\n*:..。o○☆*゜(・ェ・人) .*:..。o○☆*゜ゴメンЙЁ!! "), new CommandLink("プログラムの応答をまちます。", "いつ終了するか解りませんのでゆっくりお茶でもしばいてください。\n(。・・)_且~~ お茶どうぞ "), new CommandLink("コンピューターを窓から投げ捨てます。", "ヽ(#`Д´)ノこんなのいらん! \n(ノToT)ノ ┫:・'.::・┻┻:・'.::・ ")); Action responseCommandLinks = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Command Link") .masthead(isMastheadVisible() ? "Windows が応答しなくなった!" : null) .message("Windows が仕事放棄しました。\nいつものことですがどうされますか?") .showCommandLinks(links.get(1), links); textArea.appendText(responseCommandLinks.toString() + "\n\n"); break; case "Font Selector": Font responseFontSelector = Dialogs.create() .owner(listView.getScene().getWindow()) .title("Font Selector") .masthead(isMastheadVisible() ? "フォントを設定します。" : null) .message("あなたの好みのフォントを選んでください。") .showFontSelector(font); textArea.appendText(responseFontSelector.toString() + "\n\n"); break; } } else { textArea.appendText("model: null\n\n"); } }); } private boolean isMastheadVisible() { return true; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.collections.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane id="AnchorPane" prefHeight="427.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="jp.yucchi.trycontrolsfx_dialog.FXMLDocumentController"> <children> <ListView id="t" fx:id="listView" prefHeight="214.0" prefWidth="292.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> <items> <FXCollections fx:factory="observableArrayList"> <String fx:value="Information" /> <String fx:value="Confirmation" /> <String fx:value="Warning" /> <String fx:value="Error" /> <String fx:value="Exception" /> <String fx:value="Text Input" /> <String fx:value="Choice Input" /> <String fx:value="Command Link" /> <String fx:value="Font Selector" /> </FXCollections> </items> </ListView> <TextArea id="t" fx:id="textArea" editable="false" prefHeight="170.0" prefWidth="292.0" wrapText="true" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="243.0" /> </children> </AnchorPane> |
Webstart: click to launch this app as webstart (Java 8 実行環境必須)
Hatena タグ: JavaFX
TAGS: JavaFX | 2013年8月19日4:23 PM | Comment : 1