您如何在 Java 中更新此自定义绘制?

Posted

技术标签:

【中文标题】您如何在 Java 中更新此自定义绘制?【英文标题】:How do you update this custom paint in Java? 【发布时间】:2015-01-27 16:59:06 【问题描述】:

我有一个基于 GUI 的实时游戏,它使用 JPanel 和 JFrame。我目前有一个覆盖的paintComponent,它根据我的代码中的某些条件进行绘制。例如:

protected void paintComponent(Graphics gfx)

    super.paintComponent(gfx);
    gfx.setFont(new Font("default", Font.BOLD, 18));

    if (one)
    
        //do something
    

    else
    
        // do something else
    

这取决于条件一次。我已经实现了一个鼠标侦听器,我想将它用于语句,以便如果有人点击某个部分,它会显示其他内容。我想返回并再次运行paintComponent,以便它在旧组件之上绘制。 paintComponent() 已经循环了吗?如果不是,如何循环运行该方法?

【问题讨论】:

不,paintComponent(Graphics g) 不会循环。只有当 JVM 调用它时才会调用它。您可以建议通过调用 repaint() 来调用它(根据 kittycat 的回答,1+),但即便如此,也不能保证它会被调用,尤其是在已经进行了多次重绘调用并且“堆叠”的情况下。 【参考方案1】:

您可以致电repaint() 重新绘制。您可以通过创建一个计时器来重新绘制它,或者在需要更新时调用它(如果您的代码足够简单,可能会更好)

编辑:关于何时使用计时器:

计时器不是必需的。我曾经在游戏中使用过它,因为我是自定义绘制整个窗口并且有几十个总是在变化的东西要绘制,并且每次调用 render() 不会让我的 CPU 满意。不过,对于一些简单的事情,最好只在有变化时才调用repaint(),因为如果没有任何变化,你就浪费了很多时间重新粉刷它。

【讨论】:

定时器有必要吗?我尝试了 repaint() 方法,但没有看到任何变化。而且它不像我想的那么简单,目前大约 4,000 行。 @AmpageGrietu:我认为您发布的代码和文本不足以让我们充分理解您的问题来回答它。如果您没有很快得到合适的答案,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。 @AmpageGrietu 4000 行是什么意思?

以上是关于您如何在 Java 中更新此自定义绘制?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用绑定解除此自定义模式?

在自定义视图中绘制描边形状

如何使用 libpq 插入此自定义数据类型?

如何以编程方式创建此自定义绑定?

UITableViewCell 自定义CG绘制iOS 7

如何在Android活动中创建此自定义弹出消息?