相关疑难解决方法(0)

Java事件派遣线程说明

我最近开始学习和探索Java中GUI编程的基础知识.

经过一段时间的编程后,我只完成了后端工作或工作,因此最接近用户界面的是命令控制台(我知道这令人尴尬).

我正在使用Swing,据我所知,这意味着我也使用AWT.

我的问题是基于这段代码:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );
Run Code Online (Sandbox Code Playgroud)

我一直在研究这一段时间,因为我想完全理解这种奇怪的代码和所遇到的术语"事件派发线程"多次.如果我错了,但正如我所理解的那样纠正我; 它与使用多个线程以及Java Swing如何解释这些线程有关.我也收集到上面的代码用于确保所有线程在创建窗口之前是"安全的",因此invokeLater?

我读过:

"你只能从Event-Dispatching Thread中调用对框架进行操作的方法"

并且只有在某些情况下才能调用main方法对框架进行操作的方法.

有人可以向我澄清一下Event-Dispatching Thread到底是什么吗?

它如何与多个执行线程相关,以及如何从main方法调用这些线程是不安全的?为什么我们需要这个invokeLater?

我们不能像其他任何对象一样创建窗口吗?

我在研究中遇到了一些障碍,因为我没有抓住这些关系和想法.

一个侧面说明,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,并因此成为最好的计划.如果我深入了解某些东西是如何工作的,那么你可以有效地使用提示和调整,而不仅仅是将它们重新编入代码中,所以请不要害怕给我一些额外的深入解释并扩展我的知识.

谢谢.

java swing awt event-dispatch-thread

54
推荐指数
2
解决办法
3万
查看次数

事件派发线程如何工作?

stackoverflow上的人的帮助下,我能够获得以下简单GUI倒计时的工作代码(它只显示一个倒数秒的窗口).我对这段代码的主要问题是这些invokeLater东西.

据我所知invokeLater,它向事件调度线程(EDT)发送任务,然后EDT在"可以"(无论这意味着什么)时执行该任务.是对的吗?

根据我的理解,代码的工作原理如下:

  1. main我们用于invokeLater显示窗口(showGUI方法)的方法中.换句话说,显示窗口的代码将在EDT中执行.

  2. 在该main方法中,我们也启动counter并且计数器(通过构造)在另一个线程中执行(因此它不在事件调度线程中).对?

  3. counter在一个单独的线程中执行,并定期调用updateGUI.updateGUI应该更新GUI.GUI正在EDT中运行.所以,updateGUI也应该在EDT中执行.这就是为什么该代码的原因updateGUI被封闭在invokeLater.是对的吗?

我不清楚的是为什么我们打电话counter给EDT.无论如何,它不是在EDT中执行的.它立即启动,一个新线程并在counter那里执行.那么,为什么我们不能counterinvokeLater块之后调用main方法呢?

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountdownNew {

    static JLabel label;

    // Method which defines the appearance of the window.   
    public static void showGUI() {
        JFrame frame = new JFrame("Simple Countdown");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label …
Run Code Online (Sandbox Code Playgroud)

java events user-interface multithreading invoke

12
推荐指数
1
解决办法
1万
查看次数

多事件调度线程

我是Java Swing的新手,我的问题与Event Queues和Dispatch threads有关.

我读到每个AppContext实例可以有多个事件队列.同样,这意味着每个AppContext事件队列都有自己的事件派发线程.

java swing awt event-dispatch-thread

6
推荐指数
1
解决办法
1443
查看次数