Tag: event dispatch thread

穿线油漆方法

我想知道如何编写以下代码,或者只是一个方法: public void run (){ public void paint(Graphics g) { g.fillRect(20, 20, 20, 20); for (int i = 20; i < 1000; i++) { g.fillRect(20, i, 20, 20); Thread.sleep(10); } } } 我发现我无法创建此代码的线程,因为我得到了一个非法的表达式错误启动,这是公平的,但我没有看到解决方法。

如何将结果从EDT传递回另一个线程?

我有以下用例: 我在线程A(不是EDT)中执行代码。 然后我想问用户一个问题,但这必须在EDT上完成,因为它涉及Swing代码(打开一个对话框等)。 最后,我想将用户的答案传递给线程A,因此它可以继续。 我很难找到一个好方法将用户的答案传递给线程A.你怎么做到这一点?

处理事件调度线程

我有一个关于’事件派遣线程’的问题。 我有一个Main类,也是一个JFrame。 它初始化代码中的其余组件,其中一些不涉及Swing,其中一些涉及。 用这样的EDT简单地初始化Main类就足够了吗?… public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new Main(); } }); } 这样一切都将在Event Dispatcher线程上运行。

问题:创建一个非常准确的Swing Timer

为了使SwingTimer准确,我喜欢@Tony Docherty On CR建议的逻辑和示例。 这是链接 。 为了突出显示给定的单词,一次又一次,总会有几微秒的延迟。 如果我有话要强调说:“你好怎么样”,每个单词的值分别是(延迟):200,300,400 ms,那么计时器的实际时间总是更多。 说而不是200毫秒,它需要216毫秒。 像这样,如果我有很多话……最后,额外的延迟是显而易见的。 我必须强调每个字母说:’h”””””0’每个应该得到200 /长度(即5)=约40毫秒。 设置每个字母后的延迟。 我的逻辑是,在开始这个过程之前,先把当前时间说成startTime 。 另外,计算totalDelay ,即totalDelay + = delay / .length()。 现在检查条件:( startTime+totalDelay-System.currentTime )如果这是-ve,这意味着时间消耗更多,所以跳过这封信。 检查直到有一个正延迟。这意味着我要添加时间直到现在,并用它开始时的过程所花费的时间差来检查它。 这可能导致跳过以突出显示字母。 但有些事情是错的。 什么,我很难搞清楚。 这可能是循环事情的一些问题。 我已经看到它进入循环(检查时间是否为-ve)只是两次。 但事实并非如此。 而且我也不确定是否会设置下一次延迟。 有任何想法吗? 这是一个SSCCE: import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.Timer; import […]

转换为ScheduledThreadPoolExecutor

我仍然是Java的初学者,所以我没有学到很多关于线程和并发的知识。 但是,我希望能够使用ScheduledThreadPoolExecutor作为计时器,因为我遇到了java.util.Timer和TimerTask的问题。 我对线程的创建非常感兴趣,并知道我将在几周内了解它们。 但是,如果有可能,有人可以给我一个基本的例子,说明如何使用util.timer将当前的迷你测试程序转换为使用ScheduledThreadPoolExecutor? 我想尽快完成这个例子,所以我没有太多时间去学习线程 – 不管我想要多少。 说完之后,请包含您认为Java初学者应该了解的有关ScheduledThreadPoolExecutor的重要信息。 示例程序 我已经做了一个快速的小例子来表示我在一个更大的程序中遇到的问题。 该程序应该做的是允许用户按下按钮来启动计数器。 然后,用户必须能够在他/她想要时停止并重新启动计数器。 在较大的程序中,此计数器保持相等至关重要,因此我使用了scheduleAtFixRate()方法。 初始延迟始终相同(在这种情况下为0)也很重要。 问题(我相信你会看到)是一旦取消定时器就无法重启 – 我希望ScheduledThreadPoolExecutor能解决这个问题。 码: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.TimerTask; import java.util.Timer; public class Tester extends JFrame { JButton push = new JButton(“Push”); static JTextArea textOut = new JTextArea(); Timer timer = new Timer(); boolean pushed = false; static […]

围绕对话框的multithreading问题创建/销毁

可能重复: Java中的SwingWorker 我有几个课程需要一起工作但是,他们不是。 首先,我有Main: public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //JFrame dummy for JDialog errors modal = new JFrame(); new PrimaryErrorDialog(“Title”, “Message”, e, false); JFrame masterWindow = new JFrame(); masterWindow.setVisible(); } } } } 它创建了PrimaryErrorDialog类: private JDialog dialog = this; private JTextArea text; […]

关于EDT(Java)

我已经在互联网上阅读了一些关于什么时候应该在EDT中运行的文章,以及什么时候不应该。 但是我仍然不确定我理解,所以我想问一些关于这个的问题: 在EDT 内默认运行哪些代码? 在EDT 之外默认运行哪些代码? 我什么时候应该使用InvokeLater(),以便默认情况下在EDT之外运行,将在其中运行? 什么时候应该阻止一段代码在EDT中运行(默认情况下),通过创建一个新线程并将该代码放入其中? 谢谢

是否可以编写自己的对象来提供ActionEvent?

我已经在线查看了java教程,他们似乎都关注捕获已经编写过的其他组件给出的ActionEvents。 是否有可能编写自己的对象,这些对象具有触发actionEvents的标准集,然后可以被已注册为侦听器的其他类捕获? 例如:如果我想要一个计算绵羊的对象发送一个actionEvent,当100只绵羊被计入所有已注册为听众的睡眠对象时。 有没有办法做到这一点有任何在线教程? 任何帮助是极大的赞赏。

线程睡眠在actionPerformed方法中

首先,我想说我知道这种方法是错误的所以我问这个问题是因为纯粹的好奇心。 可以说我有一个像这样的swing应用程序: import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ThreadSleeping { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JButton button = new JButton(“Load”); JLabel label = new JLabel(); public ThreadSleeping() { panel.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent […]

从runnable更新GUI

我正在构建一个Swing应用程序,其中一部分function应该是直观地和可听地处理和输出一些文本(使用Mary TTS)。 我需要一些关于GUI和文本处理类进行通信的最佳方法的建议。 GUI类是JPanel的子类。 在其中我有一个实现Runnable的类,名为LineProcesser,它准备将文本分派给音频播放器。 我正在使用一个线程执行器来阻止它离开EDT(这可能不是最好的方法,但它似乎达到了我所追求的结果)。 我的目的是让LineProcessor运行所有文本并在每行末尾更新JTextArea。 此外,它需要在某些点停止并等待用户输入。 用户输入完成后,GUI类应该告诉它继续处理。 以下代码说明了我目前拥有的内容: public class MyPanel extends JPanel { ExecutorService lineExecutor = Executors.newSingleThreadExecutor(); Runnable lineProcessor = new LineProcessor(); public class LineProcessor implements Runnable { private int currentLineNo = 0; public LineProcessor() { // … } @Override public void run() { // call getText(); // call playAudio(); currentLineNo++; } […]