我做了一个备份程序,我希望所有的程序备份显示在JTextArea上。 好吧,它的工作,但只有在程序完成备份后。 我该如何解决? 我运行这个代码在这里: 备份方法 public void startBackup() throws Exception { // txtarea is the JTextArea Panel.txtArea.append("Starting Backup…\n"); for (int i = 0; i < al.size(); i++) { //al is an ArrayList that holds all of the backup assignments selected // from the JFileChooser File file = new File((String) al.get(i)); File directory = new File(dir); […]
我一直在与SwingWorker合作一段时间,结果出现了一个奇怪的行为,至less对我来说。 我清楚地明白,由于性能方面的原因,一次调用publish()方法的调用就被一次调用了。 这对我来说是完全有意义的,我怀疑SwingWorker会保留某种队列来处理所有的调用。 根据教程和API,当SwingWorker结束执行时, doInBackground()正常结束或工作线程从外部取消,然后调用done()方法。 到现在为止还挺好。 但是我有一个例子(类似于教程中显示的那样), 在 done()方法执行之后 ,有process()方法调用。 由于这两个方法都在Event Dispatch Thread中执行,我希望done()在所有process()调用完成后执行。 换一种说法: 预期: Writing… Writing… Stopped! 结果: Writing… Stopped! Writing… 示例代码 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public class Demo { […]
嗨编号想知道什么是从swingworkerthread添加文本到jtextarea的最佳方式,我创build了一个jbutton通过Threadsclass()调用execute()调用的另一个类。 并且线程与此代码并行运行 public class Threadsclass extends SwingWorker<Object, Object> { @Override protected Object doInBackground() throws Exception { for(int x = 0; x< 10;x++) try { System.out.println("sleep number :"+ x); Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(eftcespbillpaymentsThreads.class.getName()).log(Level.SEVERE, null, ex); } throw new UnsupportedOperationException("Not supported yet."); } } 现在什么id喜欢做的是将x的值添加到主gui的文本区域,任何想法非常赞赏。
我的问题是,我不明白swingworker是如何工作的,因为我正在做的是使fa=worker.get()因为我有一个很长的方法,计算很多点在后台运行,因为我不'我想冻结我的界面,我想让她的结果来绘制组件图像。 但是,我不明白它在哪里去,当我做fa=worker.get()因为我的控制台打印"titi" ,我把很多其他打印看到程序的下一部分到达,但没有人打印。 请帮助我知道在get()或执行它之后编译的位置,以及如果您对如何实现我所需要的每个代码块有所了解,欢迎。 public void paintComponent(final Graphics g1){ // TODO Auto-generated method stub final int width=getWidth(); final int height=getHeight(); image= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //On transforme le rectangle de base en un rectangle qui a le meme ratio que le cadre contenant l'ancien //(Il yaura dessus la meme fractale mais avec plus de fond noir) afin […]
我有个问题。 我有一个JFrame 。 它会创build一个JDialog 。 当按下JDialog上的button时,它应该被丢弃,并发送一封电子邮件。 同时,我需要另一个JDialog以确定的JProgressBar出现。 当发送电子邮件时, JDialog应该被丢弃(并且新build一个)或者它的内容应该改变。 现在我已经失败了好几个小时了,所以我现在要问的是,如果他(她)能够给我写一个可以做我想做的伪代码的话。 只要看看SwingWorker类中应该包含什么(或者如果你认为它更好,可以使用multithreading),当创build/处理JDialog时,以及在哪里发送邮件… 我知道我在这里要求一个完成的解决scheme,但我已经在一个专业上,已经失败了很多次了…这是我的最后一招…
我已经创build了自己的SwingWorker示例来熟悉它的工作原理。 我想要做的是以下几点:当button被点击时,我想要一个进度条出现,直到任务完成我只想删除进度条,并添加一个string到对话框。 点击button时,进度条出现,但永远不会消失。 (从不删除进度条10秒后,永远不会放置标签) 这是一个SSCCE: package swingtesting; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.SwingWorker; public class SwingTesting { /** * Creates a frame that will hold a simple button to make use of SwingWorker */ public static void main(String[] args) { // TODO code application logic […]
我将这个练习作为一个教学工具来帮助我刻录一些Java GUI编程概念。 我在寻找的是一个普遍的理解,而不是一个具体问题的详细解决scheme。 我期望编写这个“正确的”将教会我很多关于如何处理未来的multithreading问题。 如果这个论坛太笼统,可能属于程序员? 我正在模拟一个读卡器。 它有一个graphics用户界面(GUI),允许我们将卡片加载到漏斗中,然后按下开始(Start)等,但其主要的“客户端”是CPU,运行在单独的线程和请求卡上。 读卡器维护一个缓冲区。 如果卡片请求进来,而且缓冲区是空的,读卡器必须从漏斗读取一张卡片(这需要1/4秒钟,这是1962年)。 卡被读入缓冲区后,读卡器将缓冲区发送给CPU,并在下一个请求之前立即启动另一个缓冲区加载操作。 如果不仅缓冲器是空的,而且料斗中没有卡片,那么我们必须等到操作员在料斗中放置了一个平台并按下开始(总是启动缓冲器加载操作)。 在我的实现中,卡片请求以invokeLater()方式发送到读卡器,在EDT上排队运行。 在myRunnable.run()时间,一个缓冲区将是可用的(在这种情况下,我们可以把它发送到CPU,并启动另一个缓冲区加载操作),或缓冲区将是空的。 如果它是空的呢? 两种可能性:(a)飞行中已经有一个缓冲载入操作,或者(b)卡片仓是空的(或尚未启动)。 无论哪种情况,保持美国东部时间都是不可接受的。 工作(和等待)必须在后台线程上完成。 为了简单起见,我试图产生一个SwingWorker来响应每个卡请求,而不pipe缓冲区的状态如何。 伪代码是: SwingWorker worker = new SwingWorker<Void, Void>() { public Void doInBackground() throws Exception { if (buffer.isEmpty()) { /* * fill() takes 1/4 second (simulated by Thread.sleep) * or possibly minutes if we need to have another * […]
目前我有两个SwingWorker线程在后台工作。 如果发生exception,该方法停止工作,但线程仍然运行。 如果发生exception,我该如何停止执行并杀死doInBackground()的线程? this.cancel(true)不会销毁/closures线程。 我怎样才能做到这一点? @Override protected Boolean doInBackground() throws Exception { try { while (true) { //some code here return true; } } catch (Exception e) { this.cancel(true); //<– this not cancel the thread return false; } } 我在NetBeans的debugging中看到这些线程。 'AWT-EventQueue-0' em execução 'AWT-Windows' em execução 'SwingWorker-pool-1-thread-1' em execução 'SwingWorker-pool-1-thread-2' em execução //*em execução = […]
请考虑下面的代码片段: import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import javax.swing.*; public class TestApplet extends JApplet { @Override public void init() { try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { createGUI(); } }); } catch(InterruptedException | InvocationTargetException ex) { } } private void createGUI() { getContentPane().setLayout(new FlowLayout()); JButton startButton = new JButton("Do work"); […]
我使用Executor来玩SwingWorker的multithreading,而且我从那里错误的发现了Vector中的错误元素,看起来像这段代码很可能忽略了Vector中不存在的元素 我的问题 – >如何/有可能以某种方式捕捉这个exception 简单的输出 run: Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name :StartShedule, SwingWorker Status is DONE Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name :StartShedule, SwingWorker Status is DONE Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name […]