Tag: swingworker

从内部类中获取事件,扩展SwingWorker

我试图从内部类中触发事件,但它不起作用。 这是我的代码: 摘要型号: public abstract class AbstractModel { public PropertyChangeSupport propertyChangeSupport; public AbstractModel() { propertyChangeSupport = new PropertyChangeSupport(this); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } } 模型: public class GUImodel extends AbstractModel { // […]

等待后台进程以不同类的SwingWorker结束

我正在将文件导入项目,一旦用户单击选择此文件,我会做一些事情,包括通过命令行。 我用这种方法完成了它: p = Runtime.getRuntime().exec(command, null, new File(directory)); p.waitFor(); 由于此过程可能需要一些时间,因此我决定在新框架中显示一个进度条弹出窗口,显示当前进程的所有输出。 我跟随@trashgod的代码改编为我的项目。 出于这个问题的目的,让我说我完全按照原样。 我只是想在命令工作时出现这个窗口,然后关闭它自己。 我可以通过从override done方法处理帧来完成此操作。 我的问题是我正在从其他类创建这个类,而在执行它时,它继续使用代码。 例如: method1(); method2(); new SwingWorkerExample().displayGUI(); //Process continues in background method3(); 这里我的method3()正在SwingWorkerExample类的进程完成之前执行。 我该怎么解决这个问题? 我已经尝试过放在displayGUI方法的末尾了: while(!backgroundTask.isDone()){ //do nothing } 但它使整个框架不起作用或者可能冻结它。 我还尝试在backgrandtask类中创建pa全局变量后编写一个方法: public Process getProcess(){ return p; } 然后从displaGUI()调用以下内容: backgroundTask.getProcess().waitFor(); 但它返回一个空指针exception。 在显示命令窗口的输出时,我还能做什么来等待进程结束? 谢谢。 更新:这是链接代码的副本,其中包含一些更改以显示我的意思。 我不希望在进程完成之前打印第二个文本: package mcve; import java.awt.BorderLayout; import java.awt.EventQueue; import […]

SwingWorker在multilpe面板中更新多个combobox

我有一个小的gui程序,在启动时从Excel文件中读取数据,其中一些数据需要转到相关的combobox。 我知道如何通过为每个combobox使用单独的SwingWorker来做到这一点: public class ExcelReader extends SwingWorker { private final DefaultComboBoxModel model; // Constructor called from a panel that has a combobox public ExcelReader(DefaultComboBoxModel model) { this.model = model; } @Override protected DefaultComboBoxModel doInBackground() throws Exception { ///// code to read data from Excel file ///// publish(someString) used here return model; } @Override protected void […]

SwingWorker,未调用done()方法

这只是SwingWorker的一个实现: class GuiWorker extends SwingWorker { private JFrame frame = new JFrame(); private JDialog dialog = new JDialog(frame, “Loadin data”, true); private JProgressBar progressBar = new JProgressBar(); private Statistics st = new Statistics(); public GuiWorker(GraphEditor editor, Statistics st) { this.st = st; Window mainWindow = SwingUtilities.windowForComponent(editor .getGraphComponent().getParent()); dialog.setSize(400, 200); int x = mainWindow.getX() + (mainWindow.getWidth() […]

GUI在运行ActionEvent之前无法直观更新

为了进一步阐述,我有一个看起来像这样的GUI: 然后我在OK按钮上有一个动作监听器,它起始如下: //OK Button Action Listener private void okButtonActionPerformed(ActionEvent e) { //Enable/Disable Buttons okButton.setEnabled(false); cancelButton.setEnabled(true); updateCheckbox.setEnabled(false); //Move on to a series of other methods here… 从理论上讲,这应该是这样的: 但是,我得到以下内容,直到完成连接到OK按钮的所有方法和其他内容: 这显然不可能发生,因为这个想法是让取消按钮可用,OK按钮和其他几个勾选框在程序的持续时间内不可用(图2),相反,它在半状态下冻结(图3)。 有没有办法打击这个?

如何正确使用SwingWorker上的publish()和process()方法?

SwingWorker中的这两个方法目前让我感到困惑,而且似乎很容易错误地使用它们。 方法publish()描述了以下内容: 将数据块发送到进程(java.util.List)方法。 此方法将在doInBackground方法内部使用,以在流程方法内的事件调度线程上提供中间结果以进行处理。 这对我来说意味着当我的工作线程正在执行其doInBackground()方法时,我能够创建“块”(这些是不是特定的或者这只是一种引用消息对象的方法?),然后发布它们在我的Swing GUI上处理。 这导致我进行处理() 。 javadoc概述了以下内容: 在Event Dispatch Thread上异步接收来自publish方法的数据块。 在查看了这两种方法的文档后,是否有人可以澄清这种方法背后的机制是什么? 据我所知,这是一个异步过程,但由于它是在EDT上进行的,我想象中有一些可预测性。 publish()文档说明了这一点: 因为在Event Dispatch Thread上异步调用了process方法,所以在执行process方法之前可能会对publish方法进行多次调用。 出于性能目的,所有这些调用都合并为一个带有连接参数的调用。 总结一下,我的问题有两个: 谁应该调用process() ? 在SwingWorker和EDT的上下文中, process()的工作流程是什么? 如果需要澄清,请告诉我。

SwingWorker挂在Unsafe.park()

我有一个SwingWorker ,它在后台与服务器通信,然后更新JFrame 。 我正在调试我的应用程序并注意到即使在SwingWorker完成其工作之后,它的线程仍然存在。 它挂在Unsafe.park(java.lang.Object) ,这是一个本机方法。 我进一步研究了这一点,发现我的应用程序中的所有其他SwingWorker在完成后都做了同样的事情。 我可以提供源代码,如果有人想要它,但我不认为这是必要的,因为问题似乎很一般。 更新 我在没有调试器的情况下运行应用程序,问题仍在发生。 这是SwingWorker线程的转储: “SwingWorker-pool-2-thread-1” daemon prio=6 tid=0x03219800 nid=0xd74 waiting on condition [0x04b7f000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) – parking to wait for (a java.util.concurrent.locks.Abstra ctQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject .await(Unknown Source) at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown […]

如何将参数传递给SwingWorker?

我正在尝试在我的GUI中实现Swing worker。 目前我有一个包含按钮的JFrame。 按下此按钮时,它应更新显示的选项卡,然后在后台线程中运行程序。 这是我到目前为止所拥有的。 class ClassA { private static void addRunButton() { JButton runButton = new JButton(“Run”); runButton.setEnabled(false); runButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new ClassB().execute(); } }); mainWindow.add(runButton); } } class ClassB extends SwingWorker { protected Void doInBackground() { ClassC.runProgram(cfgFile); } protected void done() { try { tabs.setSelectedIndex(1); } catch (Exception […]

java SwingWorker.doInBackground()不能访问GUI元素

可能这是微不足道的,我正在努力理解关于SwingWorker的简单文档。 这是复制粘贴的内容 工作流程 SwingWorker的生命周期涉及三个线程: 当前线程:在此线程上调用execute()方法。 它安排SwingWorker在工作线程上执行并立即返回。 可以等待SwingWorker使用get方法完成。 工作线程:在此线程上调用doInBackground()方法。 这是所有背景活动应该发生的地方。 要通知PropertyChangeListeners有关绑定属性的更改,请使用firePropertyChange和getPropertyChangeSupport()方法。 默认情况下,有两个绑定属性:状态和进度。 事件调度线程:此线程上发生所有与Swing相关的活动。 SwingWorker调用process和done()方法并通知此线程上的任何PropertyChangeListeners。 通常,Current线程是Event Dispatch Thread。 – 工作线程不是EDT,因此doInBackground()中的代码不能访问GUI元素。 我的理解是否正确? 背景:我们有使用SwingWorker的小代码,但有doInBackground()创建FileChooser并调用setCurrentDirectory() 。 我怀疑这导致我exception几乎与http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181(11-Closed,not a defect)相同

Java – SwingWorker – 我们可以从其他SwingWorker而不是EDT调用一个SwingWorker

我有一个SwingWorker如下: public class MainWorker extends SwingWorker(Void, MyObject) { : : } 我从EDT调用了上面的Swing Worker : MainWorker mainWorker = new MainWorker(); mainWorker.execute(); 现在, mainWorker创建了MyTask类的10个实例,以便每个实例都可以在自己的线程上运行,从而更快地完成工作。 但问题是我想在任务运行时不时更新gui。 我知道如果任务是由mainWorker本身执行的,我可以使用publish()和process()方法来更新gui。 但是由于任务是由不同于Swingworker线程的线程执行的,我如何从执行任务的线程生成的中间结果更新gui。