ControlsFXクラス Dialogs
は非推奨としてマークされています。
代わりに何を使用しますか?
このブログ投稿では、すべてについて説明しています。
http://fxexperience.com/2014/09/announcing-controlsfx-8-20-7/
このリリースは、5。29にリリースされた8.0.6以降、つまり基本的に4か月後に作成されました。これは私たちにとっては一般的ではありませんが(通常、リリースははるかに迅速です)、Eugeneと私はどちらも大規模な作業に集中できませんでした。ControlsFXダイアログAPIと実装をJavaFX自体の次のリリースに昇格させました(JavaFX 8u40に登場します) 、ただしAPIはControlsFX 8.0.6に表示されるものとは大きく異なります。最終結果として、一連のAPI設計作業(RT-12643を参照)を繰り返しましたが、ControlsFXには何のメリットもありませんでしたが、すべての時間を費やしていました。
JavaFX 8u40ダイアログのAPIが完了すると(これは8月中旬に過ぎませんでした)、ControlsFXダイアログの処理方法の計画を立てました。本質的に、JavaFX 8u40で出荷されるものよりも大幅に異なるControlsFXでダイアログAPIを維持することが賢明であるとは感じていませんでした。したがって、私たちが開発した計画は、古いControlsFX APIを廃止し、JavaFXダイアログAPIをopenjfx-dialogsと呼ばれる新しいプロジェクトにフォークし、新しいAPIを使用してControlsFXに含まれる(ただしJavaFXにはない)追加機能を再作成することでした(これには、進行状況、フォントチューザー、コマンドリンク、ログインなどのダイアログが含まれます)。
Java 8 update 60を使用すると、以前の非推奨バージョンのcontrolsfxを使用しても機能しません。そのため、解決策は、Java 8 update 40(サードパーティのライブラリは必要ありません)これらは単純なものではなく、コントロールfxのような機能でいっぱいです。しかし、より高速なコーディングのために、次のようなラッパークラスを作成できます。
package br.atualy.devolucaodevenda.util;
import javafx.scene.control.*;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.StageStyle;
import Java.awt.*;
import Java.io.PrintWriter;
import Java.io.StringWriter;
import Java.util.ArrayList;
import Java.util.List;
import Java.util.Optional;
public class FxDialogs {
public static void showInformation(String title, String message) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.initStyle(StageStyle.UTILITY);
alert.setTitle("Information");
alert.setHeaderText(title);
alert.setContentText(message);
alert.showAndWait();
}
public static void showWarning(String title, String message) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.initStyle(StageStyle.UTILITY);
alert.setTitle("Warning");
alert.setHeaderText(title);
alert.setContentText(message);
alert.showAndWait();
}
public static void showError(String title, String message) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.initStyle(StageStyle.UTILITY);
alert.setTitle("Error");
alert.setHeaderText(title);
alert.setContentText(message);
alert.showAndWait();
}
public static void showException(String title, String message, Exception exception) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.initStyle(StageStyle.UTILITY);
alert.setTitle("Exception");
alert.setHeaderText(title);
alert.setContentText(message);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
String exceptionText = sw.toString();
Label label = new Label("Details:");
TextArea textArea = new TextArea(exceptionText);
textArea.setEditable(false);
textArea.setWrapText(true);
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
GridPane.setVgrow(textArea, Priority.ALWAYS);
GridPane.setHgrow(textArea, Priority.ALWAYS);
GridPane expContent = new GridPane();
expContent.setMaxWidth(Double.MAX_VALUE);
expContent.add(label, 0, 0);
expContent.add(textArea, 0, 1);
alert.getDialogPane().setExpandableContent(expContent);
alert.showAndWait();
}
public static final String YES = "Yes";
public static final String NO = "No";
public static final String OK = "OK";
public static final String CANCEL = "Cancel";
public static String showConfirm(String title, String message, String... options) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.initStyle(StageStyle.UTILITY);
alert.setTitle("Choose an option");
alert.setHeaderText(title);
alert.setContentText(message);
//To make enter key press the actual focused button, not the first one. Just like pressing "space".
alert.getDialogPane().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode().equals(KeyCode.ENTER)) {
event.consume();
try {
Robot r = new Robot();
r.keyPress(Java.awt.event.KeyEvent.VK_SPACE);
r.keyRelease(Java.awt.event.KeyEvent.VK_SPACE);
} catch (Exception e) {
e.printStackTrace();
}
}
});
if (options == null || options.length == 0) {
options = new String[]{OK, CANCEL};
}
List<ButtonType> buttons = new ArrayList<>();
for (String option : options) {
buttons.add(new ButtonType(option));
}
alert.getButtonTypes().setAll(buttons);
Optional<ButtonType> result = alert.showAndWait();
if (!result.isPresent()) {
return CANCEL;
} else {
return result.get().getText();
}
}
public static String showTextInput(String title, String message, String defaultValue) {
TextInputDialog dialog = new TextInputDialog(defaultValue);
dialog.initStyle(StageStyle.UTILITY);
dialog.setTitle("Input");
dialog.setHeaderText(title);
dialog.setContentText(message);
Optional<String> result = dialog.showAndWait();
if (result.isPresent()) {
return result.get();
} else {
return null;
}
}
}
ダイアログを使用するには:
FxDialogs.showInformation("Hi", "Good Morning y'all!");
if (FxDialogs.showConfirm("Choose one baby!", "Can i ask you a question?", FxDialogs.YES, FxDialogs.NO).equals(FxDialogs.YES)) {
FxDialogs.showWarning(null, "Pay attention to my next question!");
String answer = FxDialogs.showTextInput("Are you a pink elephant disguised as a flying pig?", "Tell me!", "No");
FxDialogs.showError(null, "You should not have said " + answer + "!");
FxDialogs.showException("Now i'm angry", "I'm going home...", new RuntimeException("Exception caused by angry dinossaurs"));
}