Comment centrer une application JavaFX 2.0 sur la fenêtre d'un navigateur
-
27-10-2019 - |
Question
Je construis une application JavaFX 2.0 et je voudrais, lorsque l'application est déployée, de l'avoir apparaissent au centre de la fenêtre d'un navigateur. Je l'ai cherché ce sujet dans Google et Yahoo et rien trouvé. Toute aide est grandement appréciée.
La solution
Vous pouvez utiliser la combinaison de panneaux HBox et VBox dans votre FXML. Mon code est Yesterday testé:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="panel1" xmlns:fx="http://javafx.com/fxml" fx:controller="app.MainController">
<HBox alignment="CENTER" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<VBox alignment="CENTER">
<Pane fx:id="panel2"></Pane> <!-- YOUR CENTERED CONTENT HERE! -->
</VBox>
</HBox>
</AnchorPane>
Le « panel1 » étendra dans la zone du navigateur. Ainsi, le HBox et VBox sera également. Parce qu'ils ont « centre » des attributs pour leurs childeren, le « panel2 » sera centré.
Autres conseils
Regardez le code source rel="nofollow"> pour JavaFX Ensemble exemple . L'application Ensemble est configuré pour exécuter pour remplir une fenêtre de navigateur, peu importe la taille de la fenêtre. La façon dont il est fait est par la configuration du JavaScript qui lance l'application ainsi que par le style css de la div l'application est intégrée dans.
Voici un extrait des parties pertinentes du html.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaFX 2.0 - Ensemble</title>
<SCRIPT src="http://java.com/js/dtjava.js"></SCRIPT>
<script>
function javafxEmbed_ensemble() {
dtjava.embed(
{
id : 'ensemble',
url : 'Ensemble.jnlp',
placeholder : 'javafx-app-placeholder',
width : '100%',
height : '100%',
jnlp_content : '...'
},
{
javafx : '2.0+'
},
{}
);
}
dtjava.addOnloadCallback(javafxEmbed_ensemble);
</script>
<style>
html, body, #javafx-app-placeholder, #ensemble-app {
margin: 0;
overflow: hidden;
padding: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body><div id='javafx-app-placeholder'></div></body>
</html>
Si vous avez besoin de quelque chose autre que la couverture de 100%, vous pouvez les balises de 100%, disons 75%, et ajuster le style pour se css centrer dans la page avec les marges que vous voulez.
Les outils d'emballage Java courant (par exemple l'utilitaire javafxpackager), ne permettent pas de spécifier des largeurs de percentange. J'ai créé une demande de fonctionnalité pour cela dans le JavaFX JIRA - vous pouvez créer un compte là pour voir la demande. Si vous utilisez ces outils pour générer votre déploiement html , alors vous pourriez avoir de modifier le code HTML de déploiement à la main ou par un script ant post-traitement, comme on peut le voir dans le build.xml pour l'exemple d'application Ensemble.
Cette FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
<children>
<HBox id="HBox" alignment="CENTER" spacing="5.0" AnchorPane.bottomAnchor="213.0" AnchorPane.leftAnchor="168.0" AnchorPane.rightAnchor="168.0" AnchorPane.topAnchor="214.0">
<children>
<GridPane id="gridPane1" alignment="CENTER" hgap="2.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" vgap="2.0">
<children>
<Label id="label1" alignment="CENTER_RIGHT" contentDisplay="RIGHT" text="Username" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label id="label2" alignment="CENTER_RIGHT" text="Password" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TextField id="textField1" fx:id="userid" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="0" />
<PasswordField id="passwordField1" fx:id="password" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Button id="button1" alignment="CENTER_RIGHT" text="Signin" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
</children>
<columnConstraints>
<ColumnConstraints halignment="CENTER" hgrow="NEVER" maxWidth="-Infinity" minWidth="-Infinity" percentWidth="0.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
</columnConstraints>
<padding>
<Insets bottom="2.0" left="4.0" right="4.0" top="2.0" />
</padding>
<rowConstraints>
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
</children>
</HBox>
</children>
</AnchorPane>
peut résoudre votre problème
Essayez d'utiliser un StackPane comme récipient. Il centrera tous les noeuds, il comprend. Torsten