Wątek przeniesiony 2022-01-14 20:04 z JavaScript przez furious programming.

Element Canvas JavaFX nie rysuje

0

Witam, będę mega wdzięczny za pomoc, próbuje stworzyć aplikacje w JavaFX, chce zacząć tworzyć coś na panelu canvas, kod się kompiluje ale efektów brak, wydaje mi się że po prostu ni odświeża się widok panelu canvas, może jakiś spec poradzi o czym zapomniałem, wrzucam całą klace, poniżej kodu struktura okna ze scene buildera i struktura projektu.

package com.example.rpgfxmaven;

import javafx.animation.AnimationTimer;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
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.scene.layout.AnchorPane;
import javafx.scene.media.MediaPlayer;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.io.IOException;

public class GameControler{
    final int oryginalnyRozmiarLudzika = 16; // 16x16 tile
    final int skala = 3;
    final int rozmiarLudzika = skala * oryginalnyRozmiarLudzika;

    final int dlugoscPlanszy = 20;
    final int szerokoscPlanszy = 15;
    final int dlugoscEkranu = rozmiarLudzika*dlugoscPlanszy;
    final int szerokoscEkranu = rozmiarLudzika*szerokoscPlanszy;

    @FXML
    private Canvas canvaspane = new Canvas(dlugoscEkranu, szerokoscEkranu);
    GraphicsContext content;

    public static MediaPlayer mediaPlayer;

    public void start(Stage primaryStage) throws IOException {
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("maingame-window.fxml"));
        AnchorPane anchorPane=  loader.load();
        anchorPane.setPrefSize(dlugoscEkranu+100, szerokoscEkranu+75);
        Scene scene = new Scene(anchorPane);
        primaryStage.setScene(scene);
        primaryStage.show();
        content = canvaspane.getGraphicsContext2D();
        startGame();
    }

    public void startGame()
    {
        Timeline timeline = new Timeline(new KeyFrame(Duration.millis(10), e ->run(content)));
        timeline.setCycleCount(Timeline.INDEFINITE);
    }
    
    public void run(GraphicsContext content) {
        content.setFill(Color.BLUE);
    content.fillRect(100, 100, rozmiarLudzika,rozmiarLudzika);
    }
}
2

Na początek zacznij od przerobienia choćby jednego tutoriala z JavaFx bo bez tego będzie ciężko.
Ogólnie to błąd polega na tym, że instancja klasy GameController, w której ładujesz ten widok nie jest w żaden sposób powiązana z tym widokiem czyli w szczególności:

  1. w pliku maingame-window.fxml powinien być zdefiniowany controler, który ten widok obsługuje, np:
fx:controller="com.example.rpgfxmaven.GameControler"
  1. canvas w fxml powinien mieć nadane id, które powiąże go z polem kontrolera:
fx:id="canvaspane"
  1. Zgodnie z sugestią @MrMadMatt w kontrolerze definiujesz tylko pole, bez inicjalizacji

  2. jeżeli chcesz wywołać jakąś metodę na kontrolerze z zewnątrz to instancję kontrolera wyciągasz z loadera po załadowaniu widoku:

FXMLLoader loader = new FXMLLoader(this.getClass().getResource("maingame-window.fxml"));
AnchorPane anchorPane=  loader.load();
GameController gameController = loader.getController();
gameController.startGame();

1 użytkowników online, w tym zalogowanych: 0, gości: 1