当前位置: 首页 > 知识库问答 >
问题:

Canvas窗格不刷新(JavaFX)[关闭]

翟奇逸
2023-03-14

编辑问题以包括所需的行为、特定的问题或错误,以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

我将非常感谢您的帮助,我正在尝试创建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);
    }
}

共有1个答案

盖诚
2023-03-14

这是错误的:

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

绝不应将注入的FXML字段设置为新值。

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

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

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

 类似资料:
  • 问题内容: 我正在寻找某种有关组织应用程序的建议。 当您拥有包含内容选择的主菜单时,请按一个按钮,则获取控制器有两个选择:a)更改当前显示主菜单的内容b)创建一个新场景并将舞台切换到该场景一 你在用什么 有什么最佳实践吗? 目前,我更喜欢a),因为我可以保持事物链接状态栏等,但这是“干净”的方式吗? 问题答案: 首先,需要考虑一些事情: 1)更改场景将取消链接到您附加到该事件处理程序的链接,并且可

  • 在我的项目中,我有一个包含多个值的ComboBox。当我的应用程序开始时,我执行以下操作: 其中是字符串列表。 同时,在应用程序中,可以更改此值。但是,由于我已经将此组合框添加到我的GridPane中,然后在该值更改(gui.columns)时添加到场景中,因此新值没有显示在组合框中。因为我已经添加了旧的gui.course。有没有办法用新的gui.course_P更新createTestButt

  • 问题内容: 我正在尝试创建一个程序来模拟使用Java和JavaFX解决Rubik’s Cube的问题。该场景具有一个文本框,该文本框将以正确的方式显示计算机所做的每一步。文本框旁边有一个展开的多维数据集,其中 应 显示该多维数据集的当前状态。 问题在于,GUI只会更新以显示移动列表,并且在所有进程的最后都显示多维数据集的状态。我已经浏览了文档,该站点上的其他问题,其他站点上的其他问题,但找不到任何

  • 你好,我有一个应用程序有警报,在用户没有响应后,我想刷新警报/再次显示它,但由于某些原因,我没有看到第二个警报,它是空的,像: 我关闭警报,如果它显示,所以我不知道为什么下一个警报是空的。包装应用;

  • 我无法在SceneBuilder(eclipse)中使用GridPane,当我尝试在项目中插入GridPane时,SceneBuilder会在没有提示任何消息的情况下退出。 这就是我在日志文件中找到的:

  • 一天中,我在Visual Studio 2017中的测试资源管理器窗口多次锁定。虽然它不会崩溃,但当受到影响时,我不能运行任何测试,因为右键单击测试时没有任何选项可用.... 我在不同的项目中混合了NUnit和SpecFlow测试。清理和重建解决方案不起作用,测试资源管理器窗口没有更改。尝试使用“NUnit测试(单击运行)”选项也没有任何作用。 解决这个问题的唯一方法是重新启动Visual Stu