问题标签 [edt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
71 浏览

java - SwingUtilities InvokeLater- 什么被认为是不好的做法?

我有一个关于使用 SwingUtilities 的 invokeLater 方法的正确做法的问题。

所以首先,我想确认我理解正确。

据我了解,必须在 EDT 上更改 GUI,因为 Swing 组件不是线程安全的。invokeLater 方法将 Runnable 作为参数,并且该 runnable 中包含的任何内容都将在 EDT 上运行。因此,对 Swing 组件的任何调用都被放入一种队列中,在 EDT 上一次执行一个。

有了这个,我的问题是:使用它的好习惯是什么?据我所知,至少有两种方法可以做到:

1) 在main方法中,将所有代码,例如 GUI 创建、Controller 创建,甚至 Model 创建(假设为 MVC 类型模式),放在由 invokeLater 方法调用的 Runnable 中。当然,这是假设模型中任何长时间运行的任务都将使用 SwingWorker 执行。

2)将GUI创建放在invokeLater中,而将Controller创建和Model创建放在main方法中。然后,每当您需要从 Controller 访问 Swing 组件时,您可以在 invokeLater 方法中弹出所述代码,将其放置在 EDT 队列中。

这两个中的哪一个被认为是最佳实践或坏实践?如果这两个都不好,那么更好的方法是什么?

任何信息将不胜感激。

谢谢。

0 投票
1 回答
71 浏览

multithreading - 代号一:需要访问 UI 的后台线程

我的应用程序有需要访问 UI 的后台线程。想象一个国际象棋程序 (AI) 在棋盘上下棋之前“思考”了几秒钟。当线程运行时,UI 被阻止输入,但仍有输出。

涉及3个线程:

  1. CN1 淡香水
  2. 思考线程,使用 invokeAndBlock,输出有关搜索过程的信息(在 TextField 中),例如当前移动、搜索深度和搜索值
  3. 一个时钟线程,以 Thread.start() 开始,每秒更新一次 White 或 Black (TextFields) 使用的时间

在搜索(invokeAndBlock)期间,可以访问 stopButton 以强制停止搜索(未显示)。

下面是我目前的实现。它有效,我的问题是:这是实现它的正确方法吗?

(我阅读了https://www.codenameone.com/blog/callserially-the-edt-invokeandblock-part-1.html和第 2 部分。)

编辑:think、showWhiteTime 和 showBlackTime 的新版本。

0 投票
1 回答
62 浏览

java - 用于从 Java 中的不同线程更新 GUI 的非马虎设计模式

在处理 Java (Swing) 中的其他线程时,哪种设计模式最适合更新 GUI?

例如,假设一个对象(如自定义 JPanel)有一个 JList,而 DefaultListModel 支持它。一个在 Socket 上监听的线程可以接收数据,然后想要根据来自套接字的信息更新 JList。

我了解 SwingUtilities.invokeLater,但这似乎是笨拙的代码,因为实际上我有许多不同的函数可以调用(从非 EDT 线程)来操作不同的 GUI 组件。

我想到的想法是创建某种带有 ArrayBlockingQueue 的消息传递系统。基本上我实现了 Runnable 并在 SwingUtilities.invokeLater 方法调用中传入this. 然后该方法被执行,但它并不真正知道该做什么,但这就是我从线程安全的 ArrayBlockingQueue 中弹出“消息”的地方。

还有比这更好的设计模式吗?我的基本 JPanel 类

我的主要JPanel

0 投票
2 回答
72 浏览

java - 当有数千个组件时使动画更快

我试图JSplitPane用动画隐藏一个。通过隐藏,我的意思是setDividerLocation(0)它的左侧组件是不可见的(技术上它是可见的,但宽度为零):

如果你运行它,会发现一切看起来都很好,并且动画运行流畅。

但是,在实际应用中,右边JSplitPane是一个JPanelwith CardLayout,每张卡片都有很多组件。

如果您取消注释此行以模拟组件的数量:

重新运行上面的例子,你会看到动画不再流畅了。所以,问题是,是否有可能使其平滑(-ier)?

我不知道如何解决 - 如果有的话。

根据我的研究,我注册了一个全球性的ComponentListener

并看到了正在触发的大量事件。所以,我认为问题的根源在于为每个组件触发的大量组件事件。此外,似乎具有自定义渲染器(如JList-ListCellRendererJTable- TableCellRenderer)的组件,组件事件正在为所有渲染器触发。例如,如果 aJList有 30 个元素,则仅为它触发 30 个事件(组件)。似乎(这就是我提到它的原因)对于 CardLayout,“不可见”组件也发生了事件。

我知道这60*60对你来说可能听起来很疯狂,但在真正的应用程序中(我的应用程序有 ~1500),因为它是有道理的,所以这幅画更重。

0 投票
1 回答
107 浏览

batch-file - 批处理文件删除绝对路径并在多个文件中仅保留文件名

我在这里。我正在尝试编写一个 .bat 文件,该文件将遍历多个 .m3u 播放列表文件中的每一行以删除路径并仅保留文件名。

示例输入:

期望的输出:

我搜索了高低,但没有获得所需的输出。我也没有足够的经验来简化这件事。在我多次失败的尝试中,这是我迄今为止想出的:

我尝试使用的方法是获取每一行并删除符号之前(包括\符号)的所有内容。到目前为止,我已经能够让脚本在没有错误的情况下结束,但它实际上并没有做任何事情。

任何帮助将不胜感激。先感谢您。

0 投票
1 回答
56 浏览

java - 有什么区别吗?SwingWorker#publish vs SwingUtilities#invokeLater

假设我们有一个必须在后台运行的长/繁重的任务,并将其进度或其他任何内容发布到 GUI。我知道这个发布必须发生在事件调度线程上。这就是我们将 aSwingWorker用于任务的原因。

所以,我们所做的是这样的:

我的问题是,上述内容与此有何不同:

在这两种情况下,作为label.setText()对 GUI 的更新,都会运行到事件调度线程。它们有何不同?

当然,问题还在于为什么我应该在方法结束时done()对工作人员实施方法而不是调用?除了处理方法中可能抛出的异常。SwingUtilities.invokeLaterdoInBackgrounddoInBackground

0 投票
0 回答
15 浏览

edt - JOptionPane.showMessageDialog 显示空消息

我尝试使用 swing-gui 应用程序中的 JOptionPane.showMessageDialog 方法显示消息。但我收到一条空消息:meassage dialog。我用谷歌搜索了这个问题,发现了一个类似的问题。答案是必须在 Swing 事件调度线程上调用 showMessageDialog 方法。如果是这样,我添加了一个测试,结果证明是这样,但它仍然不起作用:

使用 SwingUtilities.invokeLater 方法运行 showMessageDialog 解决了这个问题,但我不明白为什么。

0 投票
0 回答
25 浏览

java - 封闭类型 GUI 的实例停止 EDT

我目前正在制作一个算法可视化工具,我正在尝试将所有其他算法放在不同的类中。我收到了这个错误

无法访问 GUI 类型的封闭实例。

所以我 gui在行中添加了(在算法类中):

它修复了错误,但没有更新 EDT。我也尝试将所有内容都设为静态,但我的重绘在引用静态和非静态方面存在问题。我试图repaint()gui.repaint()or替换frame.repaint(),但这也不能解决它,所以我又回到了原点。这是我的代码(感叹号:代码已缩短):

这是另一个类的代码(同一个包)

任何帮助将不胜感激。感谢您的阅读。

0 投票
0 回答
54 浏览

java - Java Swing paintImmediately() method works on main thread instead of EDT thread

I am writing a program, which is supposed to update and render animation for each frame. I have an AnimationPanel class which extends JPanel and an Animation class, which maintains my animation with an infinity loop. I was invoking paintComponent method by JPanel's paintImmediately method from animation (Animation object) and everything was working fast and well, until I added a new component to the JFrame. Then, components started to overlap one another, because new components were working on the EDT thread, but my animation was working on the main thread and somehow it was calling paintImmediately and then paintComponent also in the main thread, but of course it shouldn't. I tried to put the paintImmediately part of code to EDT thread and it worked, but the performance was really poor (instead of >100fps only ~40fps) and animation started lagging and it was behaving the same way as if it was repaint() method instead. So I guess I did something wrong, but I totally don't know what.
The paintComponent method looks like this:

and render method look like this:

Each object has its own render method, which usually is g2d.fill(/*object's shape*/)

The render() method called by loop:

and its modification which was laggy:

Thank you for your help!

0 投票
1 回答
82 浏览

java - Java,jframe在拖动问题时调整大小

我希望我的 jframe 根据 x 坐标更改其大小和内容。最初,jframe 出现在“主要区域”(x <= 1400)中,并在 jframe 的内容窗格中添加了一个大小为 500x500 的面板。
Desired:当它被拖动并离开“主要区域”并进入“次要区域”时,所有内容都将从内容窗格中删除,面板被包裹到大小为 200x200 的 jscrollpane 中,并将 jscrollpane 添加到内容窗格中。当 jframe 离开“辅助区域”时,jscrollpane 会从内容窗格中删除,并且面板会重新添加。
实际的: 结果不稳定。当 jframe 离开主要区域时,我可以看到一些翻转。滚动条出现,但框架改变了它的大小,但随后立即调整回原来的大小。在 changeSizeAndContent invokeLater 代码块中的可运行文件内的断点处停止(实际上不是一个好的做法)会带来所需的结果,条件断点也是如此。
发生了一些我不明白的 Swing 多线程。我可以看到 EDT 调用 EventQueue 的 dispatchEvent 并且由 changeSizeAndContent 中的可运行对象触发的 COMPONENT_RESIZED(新的,正确的大小)事件之后是 COMPONENT_MOVED(旧的,现在不正确的大小)事件,它们引用了具有旧大小的组件。
尝试使用 Java 8 和 11。