que - javafx tutorial
Alertas JavaFX y su tamaƱo (4)
Aquí está la mejor solución sin números mágicos, cambio de tamaño, etc.
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));
Esta solución funciona en Windows, Linux y Mac.
Recientemente, JavaFX introdujo Alerts (Java 8u40).
Considere el siguiente ejemplo de código. ¿Cómo puedo mostrar un mensaje completo que es más largo que unas pocas palabras? Mis mensajes (propiedad contentText
) se cortan al final con ...
y la Alerta no ajusta su tamaño correctamente en mi opinión.
En mi máquina Linux con Oracle JDK 8u40, solo veo el texto. This is a long text. Lorem ipsum dolor sit amet
This is a long text. Lorem ipsum dolor sit amet
, que es demasiado corto en algunos casos.
Por supuesto, el usuario puede cambiar el tamaño de la ventana de alerta manualmente y el texto se mostrará en consecuencia, pero no es fácil de usar.
Edición: capturas de pantalla para Windows 7 y Linux (JDK de Oracle):
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();
}
}
He hecho la siguiente solución hace algún tiempo:
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();
Como puedes ver, acabo de configurar el indicador de tamaño y establecer el tamaño preferido.
Pero esto es extraño porque este error debería arreglarse en 8u40. ¿Estás usando la última versión de 8u40?
ACTUALIZAR :
No se corrigió en 8u40. Debería ser arreglado más tarde.
He hecho la siguiente solución:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
Entonces, la ventana cambiará de tamaño automáticamente según el contenido.
Otra solución es subclasificar la alerta y aplicar el estilo deseado allí, por ejemplo:
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);
}
}
De esta forma, no tiene que repetir acciones para cada Alerta que cree.