Comment centrer une application JavaFX 2.0 sur la fenêtre d'un navigateur

StackOverflow https://stackoverflow.com/questions/9336083

  •  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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top