我最近开始学习和探索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?
我们不能像其他任何对象一样创建窗口吗?
我在研究中遇到了一些障碍,因为我没有抓住这些关系和想法.
一个侧面说明,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,并因此成为最好的计划.如果我深入了解某些东西是如何工作的,那么你可以有效地使用提示和调整,而不仅仅是将它们重新编入代码中,所以请不要害怕给我一些额外的深入解释并扩展我的知识.
谢谢.
在stackoverflow上的人的帮助下,我能够获得以下简单GUI倒计时的工作代码(它只显示一个倒数秒的窗口).我对这段代码的主要问题是这些invokeLater东西.
据我所知invokeLater,它向事件调度线程(EDT)发送任务,然后EDT在"可以"(无论这意味着什么)时执行该任务.是对的吗?
根据我的理解,代码的工作原理如下:
在main我们用于invokeLater显示窗口(showGUI方法)的方法中.换句话说,显示窗口的代码将在EDT中执行.
在该main方法中,我们也启动counter并且计数器(通过构造)在另一个线程中执行(因此它不在事件调度线程中).对?
它counter在一个单独的线程中执行,并定期调用updateGUI.updateGUI应该更新GUI.GUI正在EDT中运行.所以,updateGUI也应该在EDT中执行.这就是为什么该代码的原因updateGUI被封闭在invokeLater.是对的吗?
我不清楚的是为什么我们打电话counter给EDT.无论如何,它不是在EDT中执行的.它立即启动,一个新线程并在counter那里执行.那么,为什么我们不能counter在invokeLater块之后调用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 Swing的新手,我的问题与Event Queues和Dispatch threads有关.
我读到每个AppContext实例可以有多个事件队列.同样,这意味着每个AppContext事件队列都有自己的事件派发线程.