有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么是SwingUtilities。你是做什么的?

{}做什么?它只是在它的run方法中延迟代码块的执行吗?在invokeLater函数中调用一个动作与在我们想要执行的线程末尾调用它有什么区别?有人能帮我了解一下invokeLater函数的真正功能吗


共 (5) 个答案

  1. # 1 楼答案

    请注意,你最终会接到一个电话给你的多伦。每次调用invokeLater(doRun)时,为运行()方法。因此,如果在事件线程有机会执行其处理之前调用它十次,那么很可能会连续十次调用doRun。运行()

  2. # 2 楼答案

    它将在AWT线程上运行这段代码。它允许您从其他线程修改GUI

    Docs

    Causes doRun.run() to be executed asynchronously on the AWT event dispatching thread. This will happen after all pending AWT events have been processed. This method should be used when an application thread needs to update the GUI.

  3. # 3 楼答案

    如前所述,InvokeLater允许您在不在EventQueue上运行时安全地调用swing类中的方法。但是,通过从EventQueue中访问其他字段和类,您可以简化代码和生活。它们可以使用swing和其他工具,而无需多线程的所有麻烦。如果启动了另一个线程,请使用InvokeLater尽快返回EventQueue,并尽量减少必须同步或以其他方式保护的字段数

    如果您需要充分利用多个内核,那么您将不得不减少EventQueue的使用,并且您将不得不在复杂性方面付出巨大代价

  4. # 4 楼答案

    正如其他答案所说,它在AWT事件调度线程上执行Runnable。但你为什么要这么做?因为Swing数据结构不是线程安全的,所以为了给程序员提供一种易于实现的方法来防止并发访问它们,Swing设计人员制定了一条规则,即访问它们的所有代码必须在同一个线程上运行。对于事件处理和显示维护代码,这会自动发生,但如果您启动了一个长时间运行的操作(当然是在一个新线程上),您如何发出其进度或完成的信号?您必须修改Swing控件,并且必须从事件调度线程进行修改。因此invokeLater

  5. # 5 楼答案

    这可能是评论,但看起来就像。。。,只是一些基本的东西

    1/创建自己的EDT以正确更新GUI,例如,如果使用普通的Threadjava.util.TimerExecutor执行一些代码。。更多here

    2/帮助将Focus设置为JComponents如果有一些Listeners,因为如果有f.e.DocumentListener,那么你很难将Focus设置为所需的JComponents

    3/延迟代码执行块,并将其移动到EDT的末端