2014-05-10 28 views
5

Sono nuovo di javafx quindi per favore portami con me. Quindi quello che voglio fare è qualcosa di veramente semplice, ma non riesco a capire come ottenerlo correttamente.Come centrare un nodo all'interno di un riquadro javafx

Obiettivo: creare un riquadro che sia 500 per 500. Voglio aggiungere un nodo e nel nostro caso diciamo una vista immagine che contiene un'immagine 200 per 200. Voglio poter aggiungere la vista dell'immagine al riquadro e averlo centrato.

ImageView view = new ImageView(); 

    Image img = new Image("test.png"); 
    view.setImage(img); 
    Pane pane = new Pane(); 
    pane.setMinWidth(500); 
    pane.setMinWidth(500); 
    pane.getChildren().add(view); 

Qualche consiglio apprezzato, Grazie, D

+0

Qualsiasi motivo per cui non è possibile utilizzare uno 'StackPane',' HBox' o 'VBox'? Possono avere il loro set di allineamento che centrerà automaticamente i loro bambini in entrambe le dimensioni se usi 'Pos.CENTER'. –

+0

L'idea generale è che ho un pannello di ancoraggio e quindi voglio che l'utente sia in grado di aggiungere qualsiasi layout (VBox, HBox o Stackpane). Tuttavia, la dimensione del riquadro di ancoraggio cambia e non ha dimensioni preferite. Come potresti quindi centrarlo con qualsiasi layout tu usi. – darewreck

+0

Le scelte di layout che hai citato risolvono il problema come ho spiegato sopra. Sono confuso. Perché devi usare un 'AnchorPane'? –

risposta

13

si hanno 2 scelte:

1) Ad esempio utilizzando StackPane invece di Pane (perché si può usare Pos)

StackPane p = new StackPane(); 
p.setPrefSize(700,700); //set a default size for your stackpane 
Image img = new Image("test.png"); //create an image 
ImageView v = new ImageView(img); //create an imageView and pass the image 

p.getChildren().add(v); //add imageView to stackPane 
StackPane.setAlignment(v,Pos.CENTER_LEFT); //set it to the Center Left(by default it's on the center) 
stage.setScene(new Scene(p)); 
stage.show(); 

2) È possibile utilizzare JavaFx Scene Builder, è uno strumento di layout visivo per JavaFx. Per esempio se voglio creare un layout Hbox:

<?import java.lang.*?> 
<?import java.net.*?> 
<?import java.util.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.effect.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.shape.*?> 
<?import javafx.scene.text.*?> 

<HBox alignment="CENTER" prefHeight="369.0" prefWidth="425.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" > 
    <children> 
     <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" x="0.0" HBox.hgrow="NEVER"> 
      <image> 
       <Image url="@../yourImg.png" /> 
      </image> 
     </ImageView> 
    </children> 
</HBox> 

salvataggio come myLayout.fxml all'interno della vostra classe principale e aggiungere in seguito al codice:

Hbox root = FXMLLoader.load(getClass().getResource("myLayout.fxml")); 
Scene scene = new Scene(root); 
stage.setScene(scene); 
stage.show(); 
+1

Grazie. Cosa succede se si tratta di un anchorpane senza una dimensione preferita. Ho provato ad aggiungere lo stackPane al riquadro di ancoraggio. Tuttavia, senza le dimensioni perferite, il centraggio non funzionerà. Nel mio esempio, il riquadro di ancoraggio può essere ridimensionato perché le schede di sinistra, destra, superiore e inferiore possono essere aperte e possono modificare le dimensioni del riquadro di ancoraggio centrale. – darewreck

2

Io di solito uso il seguente approccio per centrare un nodo/riquadro:

<VBox alignment="CENTER"> 
    <HBox alignment="CENTER"> 
     <!-- your node/pane --> 
    </HBox> 
</VBox>