【问题标题】:Canvas pane doesn't refreshing(JavaFX) [closed]画布窗格不刷新(JavaFX)[关闭]
【发布时间】:2022-01-14 19:04:49
【问题描述】:

非常感谢您的帮助,我正在尝试创建 JavaFX 应用程序,我想开始在画布面板上创建一些东西,代码正在编译但没有效果,在我看来画布面板视图不是刷新了,也许一些规范会告诉我忘记了什么,我把整个类都扔进去了,代码下面是来自场景构建器的窗口结构和项目结构。

[![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);
    }
}

【问题讨论】:

  • 这是一个控制器类,还是一个Application 子类?不应该两者兼而有之。
  • @James_D 你的意思是在控制器中不应该有启动方法等?我应该为它自己上课吗?但只是为了知道,在我的例子中,我该怎么做,如果我知道为什么画布不起作用,那么我将为此制作两个类
  • 是的,控制器应该有一个单独的类。你没有把它作为Application 的子类,所以根本不清楚start(...) 在哪里被调用。而且,正如其他人指出的那样,初始化注释为@FXML 的字段总是不正确的。这里同时有太多错误的地方,也没有足够的信息来提供完整的答案。
  • 如果你想刷新每一帧,那么研究 JavaFX 和 AnimationTimer 中的游戏循环。时间线可以工作,但帧上限默认为 60fps,即帧之间为 16 2/3 毫秒,因此持续时间为 10 毫秒的时间线的关键帧只会每 16 2/3 毫秒最大调用一次。

标签: java javafx canvas


【解决方案1】:

这是错误的:

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

您永远不应将@FXML 注入字段设置为新值。

fxml 加载器已经创建了@FXML 字段的一个实例,并将其链接到加载器返回的对象树中。

如果为该字段分配新值,则新值将不会在加载到场景图中的加载对象树中,因此永远不会被看到。只会看到加载器创建的空白画布。

除此之外,您的应用程序几乎肯定还有其他问题,但我无法在此处详细概述。

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多