web-dev-qa-db-ja.com

JavaFXアラートとそのサイズ

最近、JavaFXはAlerts(Java 8u40)を導入しました。

以下のコード例を検討してください。ほんの数語よりも長い完全なメッセージを表示するにはどうすればよいですか?私のメッセージ(contentTextプロパティ)は最後に...でカットされ、私の意見ではアラートはそのサイズを適切に調整しません。

Oracle JDK 8u40を搭載したLinuxマシンでは、This is a long text. Lorem ipsum dolor sit ametというテキストしか表示されません。これは場合によっては短すぎます。

もちろん、ユーザーは手動で警告ウィンドウのサイズを変更でき、それに応じてテキストが表示されますが、それはユーザーフレンドリーではありません。

編集:Windows 7およびLinux(OracleのJDK)のスクリーンショット: Windows AlertLinux Alert

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;


public class TestAlert extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Alert a = new Alert(AlertType.INFORMATION);
        a.setTitle("My Title");
        a.setHeaderText("My Header Text");
        a.setResizable(true);
        String version = System.getProperty("Java.version");
        String content = String.format("Java: %s.\nThis is a long text. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", version);
        a.setContentText(content);
        a.showAndWait();
    }
}
33
Spiegelritter

次の回避策を講じました。

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();

したがって、ウィンドウはコンテンツに応じて自動的にサイズ変更されます。

44
Clairton Luz

マジックナンバーやサイズ変更などのない、より良い回避策を次に示します。

Alert alert = new Alert(AlertType.ERROR, "content text");
alert.getDialogPane().getChildren().stream().filter(node -> node instanceof Label).forEach(node -> ((Label)node).setMinHeight(Region.USE_PREF_SIZE));

このソリューションは、Windows、Linux、およびMacで動作します。

17
Sergio

しばらく前に次の回避策を作成しました。

Alert dialog = new Alert(Alert.AlertType.ERROR);
dialog.setHeaderText("Connection Failed");
dialog.setContentText(this.getException().getMessage());

//FIXME: Remove after release 8u40
dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(480, 320);

dialog.showAndWait();

ご覧のとおり、サイズ変更可能なフラグを設定し、優先サイズを設定するだけです。

しかし、これはこのバグ 修正する必要がある 8u40であるため、奇妙です。 8u40の最新ビルドを使用していますか?

[〜#〜] update [〜#〜]

8u40では修正されていません。 修正する必要があります 後で。

14
Maxim Dobryakov

別の解決策は、Alertをサブクラス化し、そこに目的のスタイルを適用することです。例えば:

class SubAlert extends Alert
{
    {
        setHeaderText("");
        getDialogPane().getStylesheets().add("some_stylesheet");
        getDialogPane().getStyleClass().add("style_class");
        getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
    }

    SubAlert(AlertType alertType)
    {
        super(alertType);
    }
    SubAlert(AlertType type,String title,String content)
    {
        super(type);
        setTitle(title);
        setContentText(content);
    }
}

これにより、作成するアラートごとにアクションを繰り返す必要がなくなります。

1
Alexiy