JDK8u40 で追加された Spinner と Dialog を試してみた。
JDK8u40 でやっと Dialog が追加されました。
これでお手軽に使えることになります。
あと Spinner も、そして Formatted Text も追加されました。
今回は Spinner と Dialog をサクッと使ってみたいと思います。
毎月のお小遣いの金額を Spinner で入力してある金額より低いもしくは高い場合に Dialog を出すという超シンプルなものです。
しかし、私はこれでドツボにはまり、未だに改善策を見いだせずに困っています。
心優しい優秀な Java プログラマのかたがこの記事を見ていたらどうか解決方法をお教えくださいませ。
Dialog の設定を Modality.APPLICATION_MODAL と Modality.WINDOW_MODAL にすると思わぬ事態が発生します。
それではプログラムのソースコード及び動画を貼っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.text.*?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane id="AnchorPane" fx:id="anchorPane" prefHeight="50.0" prefWidth="272.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jp.yucchi.hellospinneranddialog.FXMLDocumentController"> <children> <Label fx:id="label_1" layoutX="14.0" layoutY="42.0" minHeight="16" minWidth="69" text="私の毎月のお小遣いは" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="10.0"> <font> <Font size="14.0" /> </font></Label> <Spinner fx:id="spinner" layoutX="145.0" layoutY="10.0" prefHeight="30.0" prefWidth="80.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="145.0" AnchorPane.topAnchor="10.0" /> <Label fx:id="label_2" layoutX="225.0" layoutY="10.0" text="です。" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="235.0" AnchorPane.topAnchor="10.0"> <font> <Font size="14.0" /> </font> </Label> </children> </AnchorPane> |
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 |
package jp.yucchi.hellospinneranddialog; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; /** * * @author Yucchi */ public class HelloSpinnerAndDialog extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("毎月のお小遣いは?"); stage.show(); } /** * @param args the command line arguments */ 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 |
package jp.yucchi.hellospinneranddialog; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.control.SpinnerValueFactory; import javafx.scene.layout.AnchorPane; import javafx.stage.Modality; /** * * @author Yucchi */ public class FXMLDocumentController implements Initializable { private BooleanProperty poor; private BooleanProperty rich; @FXML AnchorPane anchorPane; @FXML private Label label_1; @FXML private Spinner<integer> spinner; @FXML private Label label_2; @Override public void initialize(URL url, ResourceBundle rb) { poor = new SimpleBooleanProperty(true); rich = new SimpleBooleanProperty(true); // 0 から 100,000 まで 5,000 ずつ加減算する、初期値は 50,000 の Spinner spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 100_000, 50_000, 5_000)); // // Spinner のデザインを水平にする // spinner.getStyleClass().add(Spinner.STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL); spinner.valueProperty().addListener((ov, oldValue, newValue) -> { System.out.println(newValue); if (newValue <= 30_000 && poor.getValue()) { poor.setValue(Boolean.FALSE); showPoorDialog(); } if (newValue >= 70_000 && rich.getValue()) { rich.setValue(Boolean.FALSE); showRichDialog(); } }); } private void showPoorDialog() { Alert alert = new Alert(AlertType.WARNING, "もう少しお小遣いを増やしましょう。", ButtonType.OK); alert.initModality(Modality.NONE); alert.initOwner(anchorPane.getScene().getWindow()); alert.getDialogPane().setHeaderText("少ないですね。"); alert.showAndWait() .filter(response -> response == ButtonType.OK) .ifPresent(response -> System.out.println(":p")); } private void showRichDialog() { Alert alert = new Alert(AlertType.INFORMATION, "お金で愛は買えないが、お金で愛は潤います。", ButtonType.OK); alert.initModality(Modality.NONE); alert.initOwner(anchorPane.getScene().getWindow()); alert.getDialogPane().setHeaderText("幸せですね!"); alert.showAndWait() .filter(response -> response == ButtonType.OK) .ifPresent(response -> System.out.println(":p")); } } |
Spinner の CSS のあてかたも解らないので入力値を右寄せにしたり色を変えたりとかもしたかったのですがそれはネット上に情報が出てきてからボチボチ勉強していきたいですね。
追記:キーボードからカーソルキー入力では問題ないのでバグの可能性が高いです。
TAGS: JavaFX | 2015年3月8日10:57 AM
Comment
ゆっちのBlog » JDK8u40 で追加された Spinner と Dialog を試してみた。 とりあえず回避方法をみつけた。 ゆっちのBlog » JDK8u40 で追加された Formatted Text も試してみた。
Trackback
2015年3月13日12:02 AM(編集)
[...] JDK8u40 で追加された Spinner と Dialog を試してみた。 [...]
2015年3月26日8:57 PM(編集)
[...] JDK8u40 で追加された Spinner と Dialog を試してみた。 [...]
Trackback URL