Tag: swingworker

SwingWorker的基本原理是什么?

对于我可以阅读的内容,它用于在swing应用程序中调度新线程以执行某些“后台”工作,但是使用它而不是“普通”线程有什么好处? 是不是使用新的Thread并且完成后使用SwingUtilities.invokeLater调用一些GUI方法?… 我在这里想念的是什么? http://en.wikipedia.org/wiki/SwingWorker http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

Java – SwingWorker和SwingUtilities.invokeLater()之间的区别

SwingWorker用于以下目的: 用于在不同的线程中运行长时间运行的任务,以防止GUI无响应 用于通过done()方法在任务结束时使用长时间运行的任务生成的结果更新GUI。 用于在不依赖于publish()和process()方法的情况下由任务生成和发布的中间结果来不时更新GUI。 SwingUtilities.invokeLater()可以执行上述任务,如下所示: 我们可以执行ExecutorService.submit(new MyRunnable()) ,而不是从EDT执行SwingWorker.execute()方法,因为它还会创建另一个可以执行长时间运行任务的线程。 为了在任务结束时更新GUI,我们可以在任务结束时放置代码(用case1的done()方法编写) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) 。 为了在任务中间更新GUI,我们可以将代码(在case1的process()方法中编写) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())放在我们在case1中调用publish()方法的地方。 我问这个问题是因为Java-SwingWorker中指定的问题- 我们可以从其他SwingWorker调用一个SwingWorker而不是EDT可以通过SwingUtilities.invokeLater()解决但是无法用SwingWorker解决

Swingworker实例不同时运行

我的电脑有4个内核,我正在运行Java swing gui程序。 当我运行我的应用程序时,它只使用两个内核和大约30%的CPU利用率。 我有大量要处理的文件,并希望将它们分成两个线程,以便使用更多的cpu更快地完成此任务。 我有一个名为PrepareTask的SwingWorker类,它有一个带有两个int的构造函数: class PrepareTask extends SwingWorker { int start, end; PrepareTask (int start, int end) { … } … public Void doInBackground() {… } public void done() { … } 我创建了两个这样的实例: PrepareTask prepareTask = new PrepareTask(0,numberOfFiles/2); prepareTask.execute(); PrepareTask prepareTask2 = new PrepareTask(numberOfFiles/2, numberOfFiles); prepareTask2.execute(); 两者都被启动(它出现),但是当它运行时,我可以看到(打印stmts)第一个准备必须在第二个开始之前完成(在里面打印stmts)。 CPU利用率与以前相同,约为30%。 它们当然都从同一个源中获取数据,即DefaultTableModel。 关于如何做到这一点或我做错了什么的想法? 谢谢。

动态地向JTable添加行 – 为什么它们一次出现?

在这个例子中,我试图在我的GUI中添加一个表,然后动态地向其添加行(以显示进度)。 我不明白的是为什么所有的行都会立刻出现。 我的意思是,桌子的变化,不是吗? 有人可以给我一个解释吗? import java.awt.Component; public class Main { public static void main(String[] args) { // Show GUI java.awt.EventQueue.invokeLater(new Runnable() { public void run() { GUI gui = new GUI(); gui.setVisible(true); DefaultTableModel model = new DefaultTableModel( new String[] { “Column 1”, “Column 2” }, 0); JTable table = new JTable(model); gui.add(table); gui.validate(); for (int […]

使用SwingWorker在后台执行复杂的任务

我有登录界面的GUI。 每当我按下登录按钮时,都会检查用户名和密码以防在在线mysql数据库中输入,我在登录按钮的actionPerformed()方法中从数据库中提取所有这些信息。问题是当程序从数据库中获取数据时GUI冻结。我搜索了我的问题,发现我应该使用SwingWorker,但作为一个新手我没有得到如何使用SwingWorker为我的目的。

Java GUI线程 – SwingWorker

我有一个关于SwingWorker和Java GUI的问题。 我有几个处理信息的类,我们可以称它们为Foo1 , Foo2和Foo3 。 此处理可能需要很长时间。 这些都是Foo子类,但是Foo不是直接调用的( Foo[x]类使用从Fooinheritance的方法。为了保持EDT自由绘制进度条,在保持时使用SwingWorker的最佳方法是什么我的对象层次结构?是否有可能让包装类如Foo1Worker extends SwingWorker并使其doInBackground()调用Foo1.myProcessMethod() ?即使Foo1没有扩展SwingWorker ,这仍然可以按照我的预期工作吗? 编辑:为了澄清我的问题,即使它们已经是子类,我如何制作Foo[x] SwingWorkers?

JProgressBar不会在setProgress上触发propertyChange

我已经阅读了许多关于JProgressBar的不同文章……包括在Java上找到的狡猾的代码; 这里。 大多数人表示你需要一个SwingWorker才能正常发生事情,这很有道理,我理解的很多。 我发现当我调用setProgress(value)来更新进度条时,它并不会在大多数情况下触发propertyChange事件。 我已经检查了我传递给setProgess的值,它肯定每次都会改变,所以我不确定它是否只是过快地触发事件? 请参阅下面的相关代码,非常感谢任何帮助/解释。 class ProgBar extends SwingWorker { public ProgBar() { addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (“progress”.equals(evt.getPropertyName())) { int value = (Integer)evt.getNewValue(); System.out.println(“propertyChange called with: ” + value); loginProg.setValue(value); } } }); loginProg.setStringPainted(true); loginProg.setValue(0); setProgress(0); } @Override public Void doInBackground() throws InterruptedException { … int count = […]

SwingWorker ProgressBar

我正在尝试获得一个进度条以准确反映我的SwingWorker。 但我真的无法弄清楚该怎么做。 我得到了一个静态动画,直到操作完成,但我想要一个真正的活动栏。 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package frglauncher; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.MalformedURLException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; import […]

java – 一个接一个地执行每个SwingWorker类

我有多个类扩展SwingWorker。 我希望实现的是逐个执行每个类(不执行上一个类’done方法中的下一个类)。 例如,假设我有: ClassSwingW1 csw1 = new ClassSwingW1(); csw1.execute; ClassSwingW2 csw2 = new ClassSwingW2(); csw2.execute; ClassSwingW3 csw3 = new ClassSwingW3(); csw3.execute; 等等。 public class ClassSwingW1 extends SwingWorker { @Override protected Void doInBackground() throws Exception { //do something return null; } } public class ClassSwingW2 extends SwingWorker { @Override protected Void doInBackground() throws Exception { //do […]

安全地打开和关闭模态JDialog(使用SwingWorker)

我需要一种方法从数据库中获取一些数据,并阻止用户修改当前的现有数据。 我创建了一个SwingWorker来进行数据库更新,并创建了一个模态JDialog来向用户显示正在发生的事情(使用JProgressBar)。 modal dialog的defaultCloseOperation设置为DO_NOTHING,因此只能通过正确的调用关闭 – 我使用setVisible(false) 。 MySwingWorkerTask myTask = new MySwingWorkerTask(); myTask.execute(); myModalDialog.setVisible(true); SwingWorker在doInBackground()中执行一些操作,最后调用: myModalDialog.setVisible(false); 我唯一担心的问题是:在工作人员生成之后,SwingWorker可能会在setVisible(false)之前执行setVisible(false)吗? 如果是这样, setVisible(true)可能永远阻塞(用户无法关闭模态窗口)。 我必须实现以下内容: while (!myModalDialog.isVisible()) { Thread.sleep(150); } myModalDialog.setVisible(false); 确保它实际上会被关闭?