es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Accediendo a un lienzo en la escena de JavaFX usando FXML Loader

Así que estoy tratando de crear una escena que sea un panel que contenga un lienzo. Este lienzo tendrá que estar dentro de este panel, ya que voy a mostrar información junto a él. He utilizado SceneBuilder para crear un panel y luego coloqué un lienzo llamado “drawing” dentro de él. Luego cargo la escena e intento dibujar en el lienzo, sin embargo, obtengo un error que dice que el lienzo es nulo. Sé que hay respuestas a preguntas similares, sin embargo, no responden mi pregunta en mi contexto, no lo siento. Si lo hacen, ¿podría explicar cómo ya que no entiendo?

package uk.ac.rhul.cs3821;

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;

public class TurtleView extends Application {

  private static volatile TurtleView instance = null;

  Turtle turtle = new Turtle(0,0,0);

  @FXML
  private Canvas drawing;

  private GraphicsContext gc;

  @FXML
  void initialize() {
    instance = this;
  }

  /**
   * Creates a JavaFX instance and Launches the JavaFX application.
   * 
   * @return the JavaFX instance running
   */
  public static synchronized TurtleView getInstance() {
    if (instance == null) {
      new Thread(() -> Application.launch(TurtleView.class)).start();
      // Espera hasta que la instancia esté lista ya que se ha ejecutado la inicialización.
      while (instance == null) {
        // cuerpo vacío
      }
    }

    return instance;
  }

  @Override
  public void start(Stage primaryStage) throws Exception {
    Parent root = FXMLLoader.load(RuleView.class.getResource("TurtleView.fxml"));
    Scene scene = new Scene(root, 800, 500);
    primaryStage.setScene(scene);
    primaryStage.show();
    gc = drawing.getGraphicsContext2D();
  }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una escena que sea un panel que contenga un lienzo, puedes seguir estos pasos:

    1. Crea un panel en SceneBuilder.
    2. Agrega un elemento de lienzo llamado “drawing” dentro del panel.
    3. Guarda el archivo FXML y sal de SceneBuilder.
    4. En tu clase de Java, carga el archivo FXML usando FXMLLoader y crea una escena a partir de él.
    5. Obtén el GraphicsContext del lienzo llamando al método getGraphicsContext2D() en el elemento de lienzo.
    6. Utiliza el objeto GraphicsContext para dibujar en el lienzo.

    En tu código, parece que has realizado los pasos del 1 al 4 correctamente. Sin embargo, estás obteniendo una NullPointerException al intentar obtener el GraphicsContext del lienzo. Esto podría ser porque la anotación @FXML no se ha inyectado correctamente con el elemento de lienzo del archivo FXML.

    Para solucionar esto, asegúrate de que el archivo FXML se haya cargado correctamente y que la anotación @FXML se haya inyectado correctamente con el elemento de lienzo. Puedes intentar agregar una verificación de nulo antes de obtener el objeto GraphicsContext para ver si se ha inyectado correctamente.

    @FXML
    private Canvas drawing;
    
    private GraphicsContext gc;
    
    @FXML
    void initialize() {
        instance = this;
        // Agrega una verificación de nulo antes de obtener el objeto GraphicsContext
        if (drawing != null) {
            gc = drawing.getGraphicsContext2D();
        }
    }
    

    Esto debería asegurar que el objeto GraphicsContext se inyecte correctamente antes de usarlo para dibujar en el lienzo.

Comments are closed.