2012-03-22 21 views
5

Estoy tratando de hacer un componente personalizado para javafx, por lo que hago que mi clase amplíe javafx.scene.control.Control y en el constructor extrae su contenido.JavaFX: ¿Cómo hacer que mi componente personalizado use todo el espacio disponible desde el diseño principal?

Mis dudas son: ¿cómo hago que "crezca" para llenar todo el espacio disponible en su diseño principal? Al igual que cuando coloco un TextArea lugar ...

Este es un ejemplo de lo que estoy haciendo encoger:

@Override 
public void start(Stage primarystage) throws Exception { 
    BorderPane bpane = new BorderPane(); 
    mainscene = new Scene(bpane, 800, 600); 
    ((BorderPane) this.mainscene.getRoot()).setCenter(t); 

    primarystage.setScene(mainscene); 
    primarystage.show(); 
} 

En este ejemplo, el TextArea obtendrá todo el espacio del diseño proporciona para ello. ¡Quiero que mi componente haga lo mismo!

Todo lo que ya he intentado hacer: - Cambiar las propiedades setMaxWidth/Height, setPrefWidth/Height, setMinWidth/Height; (cuando configuro MinValues, siempre usa estos valores para dibujar pero no actualiza el valor de "ancho") - Intenté usar Double.MAX_VALUE para forzar un tamaño mayor que los privides de diseño; Todo no funcionó :(Debo estar confundiendo alguna manera ... - lloré un poco demasiado, pero incluso esto hacen nada de trabajo = '(

Tal vez es una pista, puse un oyente como esto más adelante, y cada vez que cambio el tamaño de mi solicitud/etapa se actualiza el TextArea. Pero cuando agrego este oyente hacer mi componente nunca get update ...

TextArea t = new TextArea("teste"); 
t.widthProperty().addListener(new ChangeListener() { 
    public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
    System.out.println(oldValue + "|" + newValue); 
    } 
}); 

Probablemente estoy pasando por algunas propiedades u olvidar algo, Don 'Lo sé ...

Ya probé Google, pero parece que la documentación de JavaFX es demasiado pequeña y superfici otros, y muchos de ellos se basa en JavaFX script ...

también acepta cualquier tutorial de ellos mejor el ofrecido por Oracle ...

Gracias de antemano de cualquier ayuda ... cosa que escribió a mucho ... = o

Respuesta

16

encontré lo que estaba confundiendo ...

para hacer crecer un componente con que es de los padres, todo lo que necesita hacer es definir el maxwidth y/o que MaxHeight valor máximo de doble (como a continuación), y deje minwidth/height y prefwidth/height con sus valores predeterminados.

this.setMaxWidth(Double.MAX_VALUE); 
this.setMaxHeight(Double.MAX_VALUE); 

Con esta configuración cuando el padre cambia el espacio disponible se utilizará el método final setWidth()/setHeight() para actualizar la anchura/altura de su componente puede utilizar. Entonces, como estos métodos son definitivos, no puedes anularlos para "saber" cuando ocurre un cambio. Necesitará agregar un changelistener como se muestra a continuación para recibir una notificación cuando necesite repintar su componente.

t.widthProperty().addListener(new ChangeListener() { 
     public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
     System.out.println(oldValue + "|" + newValue); 
     } 
    }); 

creo que sirve muchas otras ...

3

he encontrado (para Java 8) - que los controles personalizados sólo se redimensionan adecuadamente dentro de un nodo padre cuando pertenecen a GridPane, HBox, caja vertical o, preferiblemente, a StackPane. El ejemplo de Oracle CustomControl usa VBox. Me could'nt conseguir el cambio de tamaño para trabajar con un AnchorPane como nodo superior de mi control personalizado, ni siquiera cuando se configura explícitamente anchoMax & maxHeight

Así que la CustomControl modificado.fxml es así:

?xml version="1.0" encoding="UTF-8"?> 
<!-- Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. --> 

<?import java.lang.*?> 
<?import javafx.collections.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<fx:root type="javafx.scene.layout.StackPane" xmlns:fx="http://javafx.com/fxml"> 

    (and here inside the StackPane one can place the actual control, e.g. the 
    Anchor Pane with child nodes from ScreenBuilder - 
    works without maxWidth or maxHeight) 

</fx:root> 

y CustomControl.java extiende StackPane (en lugar de caja vertical)

+1

Con AnchorPane es necesario utilizar anclajes (por ejemplo: 'AnchorPane.setBottomAnchor (yourNode, recuadro)'). – assylias

+0

StackPane funciona para mí en el caso de un componente personalizado. Muchas gracias. – ruX

Cuestiones relacionadas