【问题标题】:Is everything inside the paintComponent method run on the EDT?paintComponent 方法中的所有内容都在 EDT 上运行吗?
【发布时间】:2014-04-22 08:37:08
【问题描述】:

如果我创建一个自定义JPanel(我正在制作的所有游戏都将显示在屏幕上),并为此覆盖它的paintComponent()。该方法中的所有内容都将在 EDT 上运行吗?那么同一个类中的其他方法呢?

如果我从我创建的线程的run() 方法内部调用自定义JPanel 上的repaint() 怎么办? paintComponent() 还会在 EDT 上运行吗?

【问题讨论】:

    标签: java swing event-dispatch-thread


    【解决方案1】:

    是的,该方法中的所有内容都将在 EDT 上运行包括您在 paintComponent() 中调用的任何方法。

    那么同一个类中的其他方法呢?

    如果它们是从paintComponent()actionPerformed() 等调用的,那么它们也将在 EDT 上!

    如果我从我创建的线程的 run() 方法内部调用自定义 JPanel 上的 repaint() 会怎样? paintComponent() 还会在 EDT 上运行吗?

    repaint() 在非 EDT 线程上将安排重绘 -> paintComponent() 在 EDT 上运行。所以是的,还在美国东部时间!顺便说一句,您可以通过在 paintComponent 方法中放置一个断点并查看哪个线程被挂起来测试它。

    【讨论】:

    • 我的游戏循环在另一个线程的 run() 方法中。从该run() 方法调用该自定义JPanel 上的repaint()(因此paintComponent())。它还会在 EDT 上运行吗?还是在我的帖子上?
    • 好的,最后一个问题。如果这个 JPanel 是我游戏的主要课程。它的paintComponent() 将绘图绘制到屏幕上,它还有许多其他数据来执行游戏逻辑和更改游戏状态。这些方法要么从类外部调用,要么从该类内部的不同方法调用(但不是从paintComponent 或actionPerformed)。这些方法不在 EDT 上运行,对吧?它们在调用它们的任何线程上运行,即使它们是从类内部调用的。对吗?
    • @Prog 是的,它们应该在调用它们的任何线程上运行。 记住作为一般经验法则,所有 Swing 方法通常都应在 EDT 上调用。因此,如果您正在运行一个工作线程,那么除了repaint() 和一些其他方法之外,它真的不应该触及任何与Swing 相关的代码。当心!
    • 当心(@Prog 还有)stackoverflow.com/q/20905985/203657 - 从 EDT 以外的任何线程调用 repaint 可能会带来麻烦
    • @Prog 原则上听起来很安全,除了我希望在 EDT 上获得键盘输入,然后安全地发布到非 EDT 线程。从设计的角度来看,您的 JPanel 类中只有可以在 EDT 上调用的方法。我将提取到控制器(MVC 中的 C)类的所有其他代码。我会使用控制器来关注以线程安全的方式更新模型(您的游戏对象)和视图(您的 JPanel)。
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2012-04-05
    • 2013-05-24
    相关资源
    最近更新 更多