tutorial paneles español ejemplos botones java javafx javafx-2

paneles - javafx tutorial netbeans



JavaFX: ¿por qué agregar un nodo a un panel varias veces o a diferentes paneles da como resultado un error? (2)

Prueba esto:

TextField tf = new TextField(); TextField tf2 = new TextField(); pane.getChildren().add(tf); pane.getChildren().add(tf2);

La razón por la que no puede agregar el mismo nodo dos veces es que solo un nodo con las mismas especificaciones y dimensiones se puede ver en la interfaz gráfica de usuario. Sería como copiar un círculo azul idéntico en un círculo azul original. Para el usuario, se ve igual, pero ocupa más memoria.

Estoy aprendiendo JavaFX básico en este momento, y no entiendo esta afirmación del libro que estoy leyendo: "No, un nodo como un campo de texto se puede agregar a un solo panel y una vez. Agregar un nodo a un panel varias veces o a diferentes paneles causará un error de tiempo de ejecución ". Puedo ver en el diagrama de UML que el libro proporciona que es una composición, pero no entiendo por qué (implementación de código de clase de biblioteca).

Por ejemplo, ¿por qué esto da como resultado un error de compilación? ¿No se ha instanciado un nuevo campo de texto dentro del panel ya que es una composición?

FlowPane pane = new FlowPane(); StackPane pane2 = new StackPane(); TextField tf = new TextField(); pane.getChildren().add(tf); pane.getChildren().add(tf);

Además, ¿por qué se ejecuta lo siguiente, pero no se muestra el campo de texto colocado en el panel?

FlowPane pane = new FlowPane(); StackPane pane2 = new StackPane(); TextField tf = new TextField(); pane.getChildren().add(tf); pane2.getChildren().add(tf); primaryStage.setScene(new Scene(pane)); primaryStage.show();


Esto es básicamente una consecuencia (deliberada) de la forma en que está diseñada la API. Cada Node tiene una colección de propiedades, incluida una propiedad parent (el único y único padre del nodo en el gráfico de escena), junto con propiedades como layoutX y layoutY que son las coordenadas del nodo en relación con su padre . En consecuencia, un nodo solo puede pertenecer a un padre y solo se puede agregar a un padre una vez (ya que solo puede tener una ubicación en el padre). Organizar las cosas de esta manera permite un proceso de diseño muy eficiente.

Otra forma de pensar en esto: supongamos que su primer bloque de código hizo lo que quería; entonces el campo de texto tf apareció dos veces en el panel de flujo. ¿Qué resultado esperaría obtener de tf.getBoundsInParent() ? Como tf aparece dos veces en el elemento primario, la API no podría dar un valor razonable para esta llamada.

Hay un par de inexactitudes en las declaraciones que hace en su pregunta:

Por ejemplo, ¿por qué esto da como resultado un error de compilación? ¿No se ha instanciado un nuevo campo de texto dentro del panel ya que es una composición?

Primero, técnicamente, esto es agregación, no composición; aunque no estoy seguro de entender la diferencia le ayudará a comprender lo que está sucediendo en este momento.

Segundo, no hay error de compilación aquí; se obtiene un error en el tiempo de ejecución (el pane detecta que el mismo node se ha agregado dos veces, el compilador no tiene manera de verificar esto).

En tercer lugar, los padres no crean copias de los nodos que les agregas. Si es así, no podría cambiar las propiedades de los nodos que se muestran. Por ejemplo, si FlowPane en su ejemplo FlowPane una instancia de un nuevo TextField cuando llamó a pane.getChildren().add(tf); y luego visualizó ese nuevo campo de texto; luego, si posteriormente llamó a tf.setText("new text") , no tendría ningún efecto, ya que no cambiaría el texto del campo de texto que se mostraba en ese pane .

Cuando llamas a pane.getChildren().add(...) pasas una referencia al nodo que deseas agregar; es ese nodo que luego se muestra como un elemento secundario del panel. Cualquier otra implementación produciría un comportamiento bastante contrario a la intuición.

En tu segundo bloque de código:

pane.getChildren().add(tf); pane2.getChildren().add(tf);

la segunda llamada establece implícitamente la propiedad parent de tf en pane2 ; en consecuencia, tf ya no es un hijo del pane . Por lo tanto, este código tiene el efecto de eliminar tf del primer pane primario. Hasta donde yo sé, este efecto secundario no está documentado, por lo que probablemente debas evitar escribir código como este.