与我之前的问题相关:从Java中的另一个类调用重绘?
我是Java的新手,我已经看过一些关于SwingWorker的教程.但是,我不确定如何使用我在上一个问题中给出的示例代码来实现它.
任何人都可以解释如何使用SwingWorker关于我的代码片段和/或指向一个体面的教程?我看了,但我不确定我还明白.
现在,我的主要是用10行调用一个gui.根据这些行中有多少行有文本,调用9个类中的1个(两行必须有文本).被调用的类执行计算,我希望将进度条绑定到.以下是其中一个被调用类的示例(每个类都相似,但足够不同以保证新类.)我认为问题违反了EDT规则,但我在其上看到的所有示例都涉及到论点.运行代码时会出现框架,但在完成所有计算之前,进度条不会更新.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class twoLoan extends JFrame {
static JFrame progressFrame;
static JProgressBar progressBar;
static Container pane;
double amountSaved = 0;
int i = 0;
public void runCalcs(Double MP, Double StepAmt,
Double L1, Double L2, Double C1, Double C2,
Double IM1, Double IM2, Double M1Start, Double M2Start) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
int iterations = (int) (MP - (M1Start * M2Start));
//Create all components
progressFrame = new JFrame("Calculation Progress");
progressFrame.setSize(300, …Run Code Online (Sandbox Code Playgroud) 我正试图找出如何在按下按钮时停止运行SwingWorker线程.我一直在四处寻找,我在解决如何做到这一点时遇到了一些麻烦.目前这就是我所拥有的:
new MySwingWorkerClass(args).execute();
Run Code Online (Sandbox Code Playgroud)
我正在创建一个按钮,我想用它来停止线程:
button = new JButton("Stop");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Stop the swing worker thread
}
});
Run Code Online (Sandbox Code Playgroud)
我已经环顾四周寻找答案,到目前为止我已经设法找到了取消方法.我不明白如何使用它来阻止我的摇摆工作者.我尝试了以下但它不起作用:
SwingWorker.cancel(true);
Run Code Online (Sandbox Code Playgroud) 我在Java 6中使用SwingWorker来避免在事件派发线程上运行长时间运行的代码.
如果在我的done()方法中调用get()会返回异常,那么处理异常的适当方法是什么?
我特别关注可能的InterruptedExceptions.JavaDoc示例简单地忽略了异常,但多年来我已经了解到吞咽异常导致难以调试的代码.
示例用法如下:
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
// do long-running calculation
return result;
}
@Override
protected void done() {
try {
setTextField(get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}.execute();
Run Code Online (Sandbox Code Playgroud) 我通过使用Executor玩SwingWorker的多线程,我在那里错误地从Vector中识别出错误的元素,看起来像这个代码相当忽略了Vector中的元素不存在
我的问题 - >如何/有可能以某种方式捕获此异常
简单的输出
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 :StartShedule, SwingWorker Status is DONE
BUILD SUCCESSFUL (total time: 11 seconds)
Run Code Online (Sandbox Code Playgroud)
通过取消注释
//changeTableValues1(); // un-comment for get ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)
一切都正确,我得到ArrayIndexOutOfBoundsException并输出
run:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: …Run Code Online (Sandbox Code Playgroud) Javadoc的done()方法SwingWorker:
在doInBackground方法完成后在Event Dispatch Thread上执行.
我已经找到了在取消工人的情况下不是这样的线索.
Done在每种情况下都会被调用(正常终止或取消),但是当cancelled它没有排入 EDT时,就像正常终止时那样.
done在SwingWorker取消a的情况下调用时是否有一些更精确的分析?
澄清:这个问题不是关于如何做到cancel的SwingWorker.这里假设SwingWorker以正确的方式取消.
而且当它们应该完成时,它不是关于线程仍在工作.
我已经和SwingWorker一起工作了一段时间并且最终出现了一种奇怪的行为,至少对我而言.我清楚地了解到,由于性能原因,一次调用中对publish()方法的几次调用是有用的.这对我来说非常有意义,我怀疑SwingWorker会保留某种队列来处理所有调用.
根据教程和API,当SwingWorker结束执行时,doInBackground()正常完成或工作线程从外部取消,然后调用done()方法.到现在为止还挺好.
但是我有一个示例(类似于教程中所示),其中在执行process()方法之后 done()执行了方法调用.由于两个方法都在Event Dispatch Thread中执行,因此我希望done()在所有process()调用完成后执行.换一种说法:
Writing...
Writing...
Stopped!
Run Code Online (Sandbox Code Playgroud)
Writing...
Stopped!
Writing...
Run Code Online (Sandbox Code Playgroud)
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 {
private SwingWorker<Void, String> worker;
private JTextArea textArea;
private Action startAction, stopAction;
private void …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
public void actionPerformed(ActionEvent e) {
setEnabled(false);
new SwingWorker<File, Void>() {
private String location = url.getText();
@Override
protected File doInBackground() throws Exception {
File file = new File("out.txt");
Writer writer = null;
try {
writer = new FileWriter(file);
creator.write(location, writer);
} finally {
if (writer != null) {
writer.close();
}
}
return file;
}
@Override
protected void done() {
setEnabled(true);
try {
File file = get();
JOptionPane.showMessageDialog(FileInputFrame.this,
"File has been retrieved and saved to:\n"
+ file.getAbsolutePath());
Desktop.getDesktop().open(file);
} catch (InterruptedException …Run Code Online (Sandbox Code Playgroud) 我已经制作了自己的SwingWorker示例,以熟悉它的工作原理.
我想要做的是以下内容:当单击按钮时,我想要一个进度条出现,直到任务完成我想简单地删除进度条并在对话框中添加一个字符串.
单击该按钮时,进度条会出现,但永远不会消失.(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 here
JFrame frame = new JFrame();
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new GuiWorker().execute();
}
});
button.setText("Test Me");
frame.getContentPane().add(button); …Run Code Online (Sandbox Code Playgroud) 使用SwingWorker代替Thread或有Runnable什么好处?
java ×10
swingworker ×10
swing ×8
cancellation ×1
jdialog ×1
jprogressbar ×1
tdd ×1
unit-testing ×1
vector ×1