uTools-Manuals/docs/java/javax/swing/SwingWorker.html

876 lines
43 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="header">
<div class="subTitle">
javax.swing
</div>
<h2 class="title" title="Class SwingWorker">Class SwingWorker&lt;T,V&gt;</h2>
</div><div class="contentContainer">
<ul class="inheritance">
<li><a href="../../java/lang/Object.html" title="class in java.lang">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>javax.swing.SwingWorker&lt;T,V&gt;</li>
</ul> </li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>
<span class="paramLabel">参数类型</span>
</dt>
<dd>
<code>T</code> - 此
<code>SwingWorker's</code>
<code>doInBackground</code>
<code>get</code>方法返回的结果类型
</dd>
<dd>
<code>V</code> - 用于执行中间结果的类型
<code>SwingWorker's</code>
<code>publish</code>
<code>process</code>方法
</dd>
</dl>
<dl>
<dt>
All Implemented Interfaces:
</dt>
<dd>
<span><a href="../../java/lang/Runnable.html" title="java.lang中的接口">Runnable</a> <a href="../../java/util/concurrent/Future.html" title="java.util.concurrent中的接口">Future</a> &lt;T&gt; <a href="../../java/util/concurrent/RunnableFuture.html" title="java.util.concurrent中的接口">RunnableFuture</a> &lt;T&gt;</span>
</dd>
</dl>
<hr/> <br/> <pre>public abstract class <span class="typeNameLabel">SwingWorker&lt;T,V&gt;</span>
extends <a href="../../java/lang/Object.html" title="class in java.lang">Object</a>
implements <a href="../../java/util/concurrent/RunnableFuture.html" title="interface in java.util.concurrent">RunnableFuture</a>&lt;T&gt;</pre>
<div class="block">
<span>在后台线程中执行冗长的GUI交互任务的抽象类。</span>
<span>可以使用几个后台线程来执行这些任务。</span>
<span>然而,为任何特定的<code>SwingWorker</code>选择一个线程的确切策略是未指定的,不应该依赖。</span>
<p> <span>当使用Swing编写多线程应用程序时请注意以下两个限制<a href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html"></a>有关详细信息,请参阅<a href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency in Swing</a> </span> </p>
<ul>
<li> <span><i>事件调度线程</i>不应该运行耗时的任务。</span> <span>否则应用程序将无响应。</span> </li>
<li> <span>只能在<i>事件分派线程</i>上访问Swing组件。</span> </li>
</ul>
<p> <span>这些限制意味着具有时间密集型计算的GUI应用程序至少需要两个线程1执行冗长任务的线程; 2所有GUI相关<i>活动的事件调度线程</i> EDT</span> <span>这涉及到可能难以实现的跨线程通信。</span> </p>
<p> <span><code>SwingWorker</code>适用于需要在后台线程中运行长时间运行的任务并在完成或处理时向UI提供更新的情况。</span> <span>SwingWorker的<code>SwingWorker</code>必须实现<a href="../../javax/swing/SwingWorker.html#doInBackground--"><code>doInBackground()</code></a>方法来执行后台计算。</span> </p>
<p> <span><b>工作流程</b></span> </p>
<p> <span>一个<code>SwingWorker</code>的生命周期中涉及到三个线程:</span> </p>
<ul>
<li><p> <span><i>当前</i>线程:在这个线程上调用<a href="../../javax/swing/SwingWorker.html#execute--"><code>execute()</code></a>方法。</span> <span>它在<i>工作</i>线程上执行<code>SwingWorker</code> ,并立即返回。</span> <span>可以等待<code>SwingWorker</code>完成使用<a href="../../javax/swing/SwingWorker.html#get--"><code>get</code></a>方法。</span> </p></li>
<li><p> <span><i>工作</i>线程:在这个线程上调用了<a href="../../javax/swing/SwingWorker.html#doInBackground--"><code>doInBackground()</code></a>方法。</span> <span>这是所有背景活动都应该发生的地方。</span> <span>要通知<code>PropertyChangeListeners</code>有关绑定属性的更改,请使用<a href="../../javax/swing/SwingWorker.html#firePropertyChange-java.lang.String-java.lang.Object-java.lang.Object-"><code>firePropertyChange</code></a><a href="../../javax/swing/SwingWorker.html#getPropertyChangeSupport--"><code>getPropertyChangeSupport()</code></a>方法。</span> <span>默认情况下,有两个绑定属性可用: <code>state</code><code>progress</code></span> </p></li>
<li><p> <span><i>事件调度线程</i> 所有Swing相关活动发生在此线程上。</span> <span><code>SwingWorker</code>调用<a href="../../javax/swing/SwingWorker.html#process-java.util.List-"><code>process</code></a><a href="../../javax/swing/SwingWorker.html#done--"><code>done()</code></a>方法,并通知任何<code>PropertyChangeListeners</code>此线程。</span> </p></li>
</ul>
<p> <span>通常, <i>当前</i>线程是<i>事件调度线程</i></span> </p>
<p> <span><i>工作</i>线程调用<code>doInBackground</code>方法之前, <code>SwingWorker</code>通知任何<code>PropertyChangeListeners</code>关于<code>state</code>属性更改为<code>StateValue.STARTED</code></span> <span><code>doInBackground</code>方法完成后,执行<code>done</code>方法。</span> <span>然后<code>SwingWorker</code>通知任何<code>PropertyChangeListeners</code>关于<code>state</code>属性更改为<code>StateValue.DONE</code></span> </p>
<p> <span><code>SwingWorker</code>仅被设计为执行一次。</span> <span>多次执行<code>SwingWorker</code>不会导致调用<code>doInBackground</code>方法两次。</span> </p>
<p> <span><b>样品用法</b></span> </p>
<p> <span>以下示例说明了最简单的用例。</span> <span>一些处理在后台完成完成后您可以更新Swing组件。</span> </p>
<p> <span>说我们要找到“生命的意义”,并在<code>JLabel</code>显示结果。</span> </p>
<pre> <span>final JLabel label;
class MeaningOfLifeFinder extends SwingWorker&lt;String, Object&gt; {
<code> @Override</code>
public String doInBackground() {
return findTheMeaningOfLife();
}
<code> @Override</code>
protected void done() {
try {
label.setText(get());
} catch (Exception ignore) {
}
}
}
(new MeaningOfLifeFinder()).execute();</span> </pre>
<p> <span>下一个示例在您希望在<i>事件分派线程</i>上准备好处理数据的情况下很有用。</span> </p>
<p> <span>现在我们要找到第一个N个素数并在<code>JTextArea</code>显示结果。</span> <span>虽然这是计算,我们想更新我们在<code>JProgressBar</code></span> <span>最后,我们还要打印质数为<code>System.out</code></span> </p>
<pre> <span>class PrimeNumbersTask extends
SwingWorker&lt;List&lt;Integer&gt;, Integer&gt; {
PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
//initialize
}
<code> @Override</code>
public List&lt;Integer&gt; doInBackground() {
while (! enough &amp;&amp; ! isCancelled()) {
number = nextPrimeNumber();
publish(number);
setProgress(100 * numbers.size() / numbersToFind);
}
}
return numbers;
}
<code> @Override</code>
protected void process(List&lt;Integer&gt; chunks) {
for (int number : chunks) {
textArea.append(number + "\n");
}
}
}
JTextArea textArea = new JTextArea();
final JProgressBar progressBar = new JProgressBar(0, 100);
PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
task.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer)evt.getNewValue());
}
}
});
task.execute();
System.out.println(task.get()); //prints all prime numbers we have got</span> </pre>
<p> <span>因为<code>SwingWorker</code>实现了<code>Runnable</code> ,一个<code>SwingWorker</code>可以提交到一个<a href="../../java/util/concurrent/Executor.html" title="java.util.concurrent中的接口"><code>Executor</code></a>执行。</span> </p>
</div>
<dl>
<dt>
<span class="simpleTagLabel">从以下版本开始:</span>
</dt>
<dd>
1.6
</dd>
</dl> </li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="nested.class.summary">
<!-- --> </a> <h3>Nested Class Summary</h3>
<table border="0" cellpadding="3" cellspacing="0" class="memberSummary" summary="Nested Class Summary table, listing nested classes, and an explanation">
<caption>
<span>Nested Classes</span>
<span class="tabEnd"> </span>
</caption>
<tbody>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Class and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class </code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.StateValue.html" title="enum in javax.swing">SwingWorker.StateValue</a></span></code>
<div class="block">
值为
<code>state</code>绑定属性。
</div> </td>
</tr>
</tbody>
</table> </li>
</ul>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- --> </a> <h3>构造方法摘要</h3>
<table border="0" cellpadding="3" cellspacing="0" class="memberSummary" summary="Constructor Summary table, listing constructors, and an explanation">
<caption>
<span>构造方法</span>
<span class="tabEnd"> </span>
</caption>
<tbody>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#SwingWorker--">SwingWorker</a></span>()</code>
<div class="block">
构造这个
<code>SwingWorker</code>
</div> </td>
</tr>
</tbody>
</table> </li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- --> </a> <h3>方法摘要</h3>
<table border="0" cellpadding="3" cellspacing="0" class="memberSummary" summary="Method Summary table, listing methods, and an explanation">
<caption>
<span class="activeTableTab" id="t0"><span>所有方法</span><span class="tabEnd"> </span></span>
<span class="tableTab" id="t2"><span><a href="javascript:show(2);">接口方法</a></span><span class="tabEnd"> </span></span>
<span class="tableTab" id="t3"><span><a href="javascript:show(4);">抽象方法</a></span><span class="tabEnd"> </span></span>
<span class="tableTab" id="t4"><span><a href="javascript:show(8);">具体的方法</a></span><span class="tabEnd"> </span></span>
</caption>
<tbody>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr class="altColor" id="i0">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#addPropertyChangeListener-java.beans.PropertyChangeListener-">addPropertyChangeListener</a></span>(<a href="../../java/beans/PropertyChangeListener.html" title="interface in java.beans">PropertyChangeListener</a> listener)</code>
<div class="block">
添加一个
<code>PropertyChangeListener</code>到侦听器列表。
</div> </td>
</tr>
<tr class="rowColor" id="i1">
<td class="colFirst"><code>boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#cancel-boolean-">cancel</a></span>(boolean mayInterruptIfRunning)</code>
<div class="block">
尝试取消执行此任务。
</div> </td>
</tr>
<tr class="altColor" id="i2">
<td class="colFirst"><code>protected abstract <a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#doInBackground--">doInBackground</a></span>()</code>
<div class="block">
计算一个结果,如果不能这样做,就会抛出一个异常。
</div> </td>
</tr>
<tr class="rowColor" id="i3">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#done--">done</a></span>()</code>
<div class="block">
<code>doInBackground</code>方法完成后,在
<i>事件调度线程</i>上执行。
</div> </td>
</tr>
<tr class="altColor" id="i4">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#execute--">execute</a></span>()</code>
<div class="block">
调度此
<code>SwingWorker</code>以在
<i>工作</i>线程上执行。
</div> </td>
</tr>
<tr class="rowColor" id="i5">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#firePropertyChange-java.lang.String-java.lang.Object-java.lang.Object-">firePropertyChange</a></span>(<a href="../../java/lang/String.html" title="class in java.lang">String</a> propertyName, <a href="../../java/lang/Object.html" title="class in java.lang">Object</a> oldValue, <a href="../../java/lang/Object.html" title="class in java.lang">Object</a> newValue)</code>
<div class="block">
向任何已注册的监听器报告绑定属性更新。
</div> </td>
</tr>
<tr class="altColor" id="i6">
<td class="colFirst"><code><a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#get--">get</a></span>()</code>
<div class="block">
等待计算完成,然后检索其结果。
</div> </td>
</tr>
<tr class="rowColor" id="i7">
<td class="colFirst"><code><a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#get-long-java.util.concurrent.TimeUnit-">get</a></span>(long timeout, <a href="../../java/util/concurrent/TimeUnit.html" title="enum in java.util.concurrent">TimeUnit</a> unit)</code>
<div class="block">
如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)。
</div> </td>
</tr>
<tr class="altColor" id="i8">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#getProgress--">getProgress</a></span>()</code>
<div class="block">
返回
<code>progress</code>绑定属性。
</div> </td>
</tr>
<tr class="rowColor" id="i9">
<td class="colFirst"><code><a href="../../java/beans/PropertyChangeSupport.html" title="class in java.beans">PropertyChangeSupport</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#getPropertyChangeSupport--">getPropertyChangeSupport</a></span>()</code>
<div class="block">
返回
<code>PropertyChangeSupport</code>
<code>SwingWorker</code>
</div> </td>
</tr>
<tr class="altColor" id="i10">
<td class="colFirst"><code><a href="../../javax/swing/SwingWorker.StateValue.html" title="enum in javax.swing">SwingWorker.StateValue</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#getState--">getState</a></span>()</code>
<div class="block">
返回
<code>SwingWorker</code>状态绑定属性。
</div> </td>
</tr>
<tr class="rowColor" id="i11">
<td class="colFirst"><code>boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#isCancelled--">isCancelled</a></span>()</code>
<div class="block">
如果此任务在正常完成之前被取消,则返回
<code>true</code>
</div> </td>
</tr>
<tr class="altColor" id="i12">
<td class="colFirst"><code>boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#isDone--">isDone</a></span>()</code>
<div class="block">
返回
<code>true</code>如果任务已完成。
</div> </td>
</tr>
<tr class="rowColor" id="i13">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#process-java.util.List-">process</a></span>(<a href="../../java/util/List.html" title="interface in java.util">List</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">V</a>&gt; chunks)</code>
<div class="block">
<i>事件调度线程</i>
<code>publish</code>
<code>publish</code>方法接收数据块。
</div> </td>
</tr>
<tr class="altColor" id="i14">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#publish-V...-">publish</a></span>(<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">V</a>... chunks)</code>
<div class="block">
发送数据块到
<a href="../../javax/swing/SwingWorker.html#process-java.util.List-"><code>process(java.util.List&lt;V&gt;)</code></a>方法。
</div> </td>
</tr>
<tr class="rowColor" id="i15">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#removePropertyChangeListener-java.beans.PropertyChangeListener-">removePropertyChangeListener</a></span>(<a href="../../java/beans/PropertyChangeListener.html" title="interface in java.beans">PropertyChangeListener</a> listener)</code>
<div class="block">
从侦听器列表中删除一个
<code>PropertyChangeListener</code>
</div> </td>
</tr>
<tr class="altColor" id="i16">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#run--">run</a></span>()</code>
<div class="block">
将此
<code>Future</code>设置为计算结果,除非已被取消。
</div> </td>
</tr>
<tr class="rowColor" id="i17">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/swing/SwingWorker.html#setProgress-int-">setProgress</a></span>(int progress)</code>
<div class="block">
设置
<code>progress</code>绑定属性。
</div> </td>
</tr>
</tbody>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- --> </a> <h3>Methods inherited from class java.lang.<a href="../../java/lang/Object.html" title="class in java.lang">Object</a></h3> <code><a href="../../java/lang/Object.html#clone--">clone</a>, <a href="../../java/lang/Object.html#equals-java.lang.Object-">equals</a>, <a href="../../java/lang/Object.html#finalize--">finalize</a>, <a href="../../java/lang/Object.html#getClass--">getClass</a>, <a href="../../java/lang/Object.html#hashCode--">hashCode</a>, <a href="../../java/lang/Object.html#notify--">notify</a>, <a href="../../java/lang/Object.html#notifyAll--">notifyAll</a>, <a href="../../java/lang/Object.html#toString--">toString</a>, <a href="../../java/lang/Object.html#wait--">wait</a>, <a href="../../java/lang/Object.html#wait-long-">wait</a>, <a href="../../java/lang/Object.html#wait-long-int-">wait</a></code></li>
</ul> </li>
</ul> </li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- --> </a> <h3>构造方法详细信息</h3> <a name="SwingWorker--">
<!-- --> </a>
<ul class="blockListLast">
<li class="blockList"> <h4>SwingWorker</h4> <pre>public SwingWorker()</pre>
<div class="block">
构造这个
<code>SwingWorker</code>
</div> </li>
</ul> </li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- --> </a> <h3>方法详细信息</h3> <a name="doInBackground--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>doInBackground</h4> <pre>protected abstract <a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a> doInBackground()
throws <a href="../../java/lang/Exception.html" title="class in java.lang">异常</a></pre>
<div class="block">
<span>计算一个结果,如果不能这样做,就会抛出一个异常。</span>
<p> <span>请注意,此方法只执行一次。</span> </p>
<p> <span>注意:该方法在后台线程中执行。</span> </p>
</div>
<dl>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
计算结果
</dd>
<dt>
<span class="throwsLabel">异常</span>
</dt>
<dd>
<code><a href="../../java/lang/Exception.html" title="class in java.lang">异常</a></code> - 如果无法计算结果
</dd>
</dl> </li>
</ul> <a name="run--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>run</h4> <pre>public final void run()</pre>
<div class="block">
将此
<code>Future</code>设置为计算结果,除非已被取消。
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/lang/Runnable.html#run--">run</a></code>在接口
<code><a href="../../java/lang/Runnable.html" title="interface in java.lang">Runnable</a></code>
</dd>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/RunnableFuture.html#run--">run</a></code>在接口
<code><a href="../../java/util/concurrent/RunnableFuture.html" title="interface in java.util.concurrent">RunnableFuture</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="seeLabel">另请参见:</span>
</dt>
<dd>
<a href="../../java/lang/Thread.html#run--"><code>Thread.run()</code></a>
</dd>
</dl> </li>
</ul> <a name="publish-java.lang.Object:A-">
<!-- --> </a><a name="publish-V...-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>publish</h4> <pre><a href="../../java/lang/SafeVarargs.html" title="annotation in java.lang">@SafeVarargs</a>
protected final void publish(<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">V</a>... chunks)</pre>
<div class="block">
<span>发送数据块到<a href="../../javax/swing/SwingWorker.html#process-java.util.List-"><code>process(java.util.List&lt;V&gt;)</code></a>方法。</span>
<span>此方法是从里面使用<code>doInBackground</code>方法在里面的<i>事件指派线程</i>提供用于处理中间结果<code>process</code>方法。</span>
<p> <span>因为<code>process</code>方法是异步调用的<i>事件指派线程</i>多次调用到<code>publish</code>方法之前,可能会出现<code>process</code>执行方法。</span> <span>为了表现目的,所有这些调用都合并成一个带有连接参数的调用。</span> </p>
<p> <span>例如:</span> </p>
<pre> <span>publish("1");
publish("2", "3");
publish("4", "5", "6");</span> </pre>
<span>可能会导致:</span>
<pre> <span>process("1", "2", "3", "4", "5", "6")</span> </pre>
<p> <span><b>样品用法</b></span> <span>此代码段加载了一些表格数据和更新<code>DefaultTableModel</code></span> <span>请注意,在<code>process</code>方法中,因为在<i>事件分派线程</i>中调用<code>process</code> ,因此它是安全的。</span> </p>
<pre> <span>class TableSwingWorker extends
SwingWorker&lt;DefaultTableModel, Object[]&gt; {
private final DefaultTableModel tableModel;
public TableSwingWorker(DefaultTableModel tableModel) {
this.tableModel = tableModel;
}
<code> @Override</code>
protected DefaultTableModel doInBackground() throws Exception {
for (Object[] row = loadData();
! isCancelled() &amp;&amp; row != null;
row = loadData()) {
publish((Object[]) row);
}
return tableModel;
}
<code> @Override</code>
protected void process(List&lt;Object[]&gt; chunks) {
for (Object[] row : chunks) {
tableModel.addRow(row);
}
}
}</span> </pre>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>chunks</code> - 要处理的中间结果
</dd>
<dt>
<span class="seeLabel">另请参见:</span>
</dt>
<dd>
<a href="../../javax/swing/SwingWorker.html#process-java.util.List-"><code>process(java.util.List&lt;V&gt;)</code></a>
</dd>
</dl> </li>
</ul> <a name="process-java.util.List-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>process</h4> <pre>protected void process(<a href="../../java/util/List.html" title="interface in java.util">List</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">V</a>&gt; chunks)</pre>
<div class="block">
<span><i>事件调度线程</i><code>publish</code><code>publish</code>方法接收数据块。</span>
<p> <span>有关详细信息,请参阅<a href="../../javax/swing/SwingWorker.html#publish-V...-"><code>publish(V...)</code></a>方法。</span> </p>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>chunks</code> - 要处理的中间结果
</dd>
<dt>
<span class="seeLabel">另请参见:</span>
</dt>
<dd>
<a href="../../javax/swing/SwingWorker.html#publish-V...-"><code>publish(V...)</code></a>
</dd>
</dl> </li>
</ul> <a name="done--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>done</h4> <pre>protected void done()</pre>
<div class="block">
<span><code>doInBackground</code>方法完成后在<i>事件调度线程</i>上执行。</span>
<span>默认实现什么都不做。</span>
<span>子类可以覆盖此方法以在<i>事件分派线程</i>上执行完成操作。</span>
<span>请注意,您可以在该方法的实现中查询状态,以确定此任务的结果或此任务是否已被取消。</span>
</div>
<dl>
<dt>
<span class="seeLabel">另请参见:</span>
</dt>
<dd>
<a href="../../javax/swing/SwingWorker.html#doInBackground--"><code>doInBackground()</code></a>
<a href="../../javax/swing/SwingWorker.html#isCancelled--"><code>isCancelled()</code></a>
<a href="../../javax/swing/SwingWorker.html#get--"><code>get()</code></a>
</dd>
</dl> </li>
</ul> <a name="setProgress-int-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>setProgress</h4> <pre>protected final void setProgress(int progress)</pre>
<div class="block">
<span><code>progress</code>绑定属性。</span>
<span>该值应该在0到100之间。</span>
<p> <span>因为<code>PropertyChangeListener</code><i>事件调度线程</i><code>PropertyChangeListener</code>通知,在调用任何<code>PropertyChangeListeners</code>之前,可能会发生对<code>setProgress</code>方法的<code>PropertyChangeListeners</code>调用。</span> <span>为了执行目的,所有这些调用都合并到一个调用中,最后一个调用参数。</span> </p>
<p> <span>例如,以下调用:</span> </p>
<pre> <span>setProgress(1);
setProgress(2);
setProgress(3);</span> </pre>
<span>可能会导致一个单独的<code>PropertyChangeListener</code>通知,值为<code>3</code></span>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>progress</code> - 要设置的进度值
</dd>
<dt>
<span class="throwsLabel">异常</span>
</dt>
<dd>
<code><a href="../../java/lang/IllegalArgumentException.html" title="class in java.lang">IllegalArgumentException</a></code> - 值不是从0到100
</dd>
</dl> </li>
</ul> <a name="getProgress--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>getProgress</h4> <pre>public final int getProgress()</pre>
<div class="block">
返回
<code>progress</code>绑定属性。
</div>
<dl>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
进度绑定属性。
</dd>
</dl> </li>
</ul> <a name="execute--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>execute</h4> <pre>public final void execute()</pre>
<div class="block">
<span>调度此<code>SwingWorker</code>以在<i>工作</i>线程上执行。</span>
<span>有多个<i>工作</i>线程可用。</span>
<span>在所有<i>工作</i>线程正忙于处理其他<code>SwingWorkers</code><code>SwingWorker</code>被放置在等待队列中。</span>
<p> <span>注意: <code>SwingWorker</code>仅被设计为执行一次。</span> <span>多次执行<code>SwingWorker</code>不会导致调用<code>doInBackground</code>方法两次。</span> </p>
</div> </li>
</ul> <a name="cancel-boolean-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>cancel</h4> <pre>public final boolean cancel(boolean mayInterruptIfRunning)</pre>
<div class="block">
<span>尝试取消执行此任务。</span>
<span>如果任务已经完成,已经被取消或由于某种其他原因而无法取消,则此尝试将失败。</span>
<span>如果成功的话,这个任务的时候还没有开始<code>cancel</code>被调用时,这个任务应该运行。</span>
<span>如果任务已经开始,那么<code>mayInterruptIfRunning</code>参数确定是否执行此任务的线程应该以试图停止任务被中断。</span>
<p> <span>此方法返回后,后续调用<a href="../../java/util/concurrent/Future.html#isDone--"><code>Future.isDone()</code></a>将始终返回<code>true</code></span> <span>随后电话<a href="../../java/util/concurrent/Future.html#isCancelled--"><code>Future.isCancelled()</code></a>总是返回<code>true</code>如果此方法返回<code>true</code></span> </p>
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/Future.html#cancel-boolean-">cancel</a></code>在接口
<code><a href="../../java/util/concurrent/Future.html" title="interface in java.util.concurrent">Future</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<span><code>mayInterruptIfRunning</code> - <code>true</code>如果执行该任务的线程应该被中断;</span>
<span>否则,正在进行的任务被允许完成</span>
</dd>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
<span><code>false</code>如果任务无法取消,通常是因为它已经正常完成;</span>
<span><code>true</code>否则</span>
</dd>
</dl> </li>
</ul> <a name="isCancelled--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>isCancelled</h4> <pre>public final boolean isCancelled()</pre>
<div class="block">
如果此任务在正常完成之前被取消,则返回
<code>true</code>
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/Future.html#isCancelled--">isCancelled</a></code>在接口
<code><a href="../../java/util/concurrent/Future.html" title="interface in java.util.concurrent">Future</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
<code>true</code>如果此任务在完成之前被取消
</dd>
</dl> </li>
</ul> <a name="isDone--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>isDone</h4> <pre>public final boolean isDone()</pre>
<div class="block">
<span>返回<code>true</code>如果任务已完成。</span>
<span>完成可能是由于正常终止,异常或取消 - 在所有这些情况下,此方法将返回<code>true</code></span>
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/Future.html#isDone--">isDone</a></code>在接口
<code><a href="../../java/util/concurrent/Future.html" title="interface in java.util.concurrent">Future</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
<code>true</code>如果这个任务完成
</dd>
</dl> </li>
</ul> <a name="get--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>get</h4> <pre>public final <a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a> get()
throws <a href="../../java/lang/InterruptedException.html" title="class in java.lang">InterruptedException</a>,
<a href="../../java/util/concurrent/ExecutionException.html" title="class in java.util.concurrent">ExecutionException</a></pre>
<div class="block">
<span>等待计算完成,然后检索其结果。</span>
<p> <span>注意:在<i>事件调度线程</i>上调用<code>get</code>阻止<i>所有</i>事件(包括重绘)被处理直到此<code>SwingWorker</code>完成。</span> </p>
<p> <span>当您想要<code>SwingWorker</code>阻止<i>事件调度线程时,</i>我们建议您使用<i>模态对话框</i></span> </p>
<p> <span>例如:</span> </p>
<pre> <span>class SwingWorkerCompletionWaiter extends PropertyChangeListener {
private JDialog dialog;
public SwingWorkerCompletionWaiter(JDialog dialog) {
this.dialog = dialog;
}
public void propertyChange(PropertyChangeEvent event) {
if ("state".equals(event.getPropertyName())
&amp;&amp; SwingWorker.StateValue.DONE == event.getNewValue()) {
dialog.setVisible(false);
dialog.dispose();
}
}
}
JDialog dialog = new JDialog(owner, true);
swingWorker.addPropertyChangeListener(
new SwingWorkerCompletionWaiter(dialog));
swingWorker.execute();
//the dialog will be visible until the SwingWorker is done
dialog.setVisible(true);</span> </pre>
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/Future.html#get--">get</a></code>在接口
<code><a href="../../java/util/concurrent/Future.html" title="interface in java.util.concurrent">Future</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
计算结果
</dd>
<dt>
<span class="throwsLabel">异常</span>
</dt>
<dd>
<code><a href="../../java/lang/InterruptedException.html" title="class in java.lang">InterruptedException</a></code> - 如果当前线程在等待时中断
</dd>
<dd>
<code><a href="../../java/util/concurrent/ExecutionException.html" title="class in java.util.concurrent">ExecutionException</a></code> - 如果计算抛出异常
</dd>
</dl> </li>
</ul> <a name="get-long-java.util.concurrent.TimeUnit-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>get</h4> <pre>public final <a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a> get(long timeout,
<a href="../../java/util/concurrent/TimeUnit.html" title="enum in java.util.concurrent">TimeUnit</a> unit)
throws <a href="../../java/lang/InterruptedException.html" title="class in java.lang">InterruptedException</a>,
<a href="../../java/util/concurrent/ExecutionException.html" title="class in java.util.concurrent">ExecutionException</a>,
<a href="../../java/util/concurrent/TimeoutException.html" title="class in java.util.concurrent">TimeoutException</a></pre>
<div class="block">
<span>如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)。</span>
<p> <span>详情请参考<a href="../../javax/swing/SwingWorker.html#get--"><code>get()</code></a></span> </p>
</div>
<dl>
<dt>
<span class="overrideSpecifyLabel">Specified by:</span>
</dt>
<dd>
<code><a href="../../java/util/concurrent/Future.html#get-long-java.util.concurrent.TimeUnit-">get</a></code>在接口
<code><a href="../../java/util/concurrent/Future.html" title="interface in java.util.concurrent">Future</a>&lt;<a href="../../javax/swing/SwingWorker.html" title="type parameter in SwingWorker">T</a>&gt;</code>
</dd>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>timeout</code> - 等待的最长时间
</dd>
<dd>
<code>unit</code> - 超时参数的时间单位
</dd>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
计算结果
</dd>
<dt>
<span class="throwsLabel">异常</span>
</dt>
<dd>
<code><a href="../../java/lang/InterruptedException.html" title="class in java.lang">InterruptedException</a></code> - 如果当前线程在等待时中断
</dd>
<dd>
<code><a href="../../java/util/concurrent/ExecutionException.html" title="class in java.util.concurrent">ExecutionException</a></code> - 如果计算引发异常
</dd>
<dd>
<code><a href="../../java/util/concurrent/TimeoutException.html" title="class in java.util.concurrent">TimeoutException</a></code> - 如果等待超时
</dd>
</dl> </li>
</ul> <a name="addPropertyChangeListener-java.beans.PropertyChangeListener-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>addPropertyChangeListener</h4> <pre>public final void addPropertyChangeListener(<a href="../../java/beans/PropertyChangeListener.html" title="interface in java.beans">PropertyChangeListener</a> listener)</pre>
<div class="block">
<span>添加一个<code>PropertyChangeListener</code>到监听器列表。</span>
<span>所有属性都注册了监听器。</span>
<span>同一个侦听器对象可以被多次添加,并且将被调用多次,因为它被添加。</span>
<span>如果<code>listener</code><code>null</code> ,那么抛出异常并且不采取任何操作。</span>
<p> <span>注意:这只是一个方便的包装。</span> <span>所有工作由<code>getPropertyChangeSupport()</code> <code>PropertyChangeSupport</code><a href="../../javax/swing/SwingWorker.html#getPropertyChangeSupport--">PropertyChangeSupport</a></span> </p>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>listener</code> - 要加入的
<code>PropertyChangeListener</code>
</dd>
</dl> </li>
</ul> <a name="removePropertyChangeListener-java.beans.PropertyChangeListener-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>removePropertyChangeListener</h4> <pre>public final void removePropertyChangeListener(<a href="../../java/beans/PropertyChangeListener.html" title="interface in java.beans">PropertyChangeListener</a> listener)</pre>
<div class="block">
<span>从侦听器列表中删除<code>PropertyChangeListener</code></span>
<span>这消除了一个<code>PropertyChangeListener</code>已注册的所有属性。</span>
<span>如果<code>listener</code>添加到同一个事件源, <code>listener</code>删除后将被通知一次。</span>
<span>如果<code>listener</code><code>null</code> ,或者从未添加过,则不会抛出任何异常,也不会采取任何操作。</span>
<p> <span>注意:这只是一个方便的包装。</span> <span>所有工作由<code>getPropertyChangeSupport()</code> <code>PropertyChangeSupport</code><a href="../../javax/swing/SwingWorker.html#getPropertyChangeSupport--">PropertyChangeSupport</a></span> </p>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>listener</code> - 要删除的
<code>PropertyChangeListener</code>
</dd>
</dl> </li>
</ul> <a name="firePropertyChange-java.lang.String-java.lang.Object-java.lang.Object-">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>firePropertyChange</h4> <pre>public final void firePropertyChange(<a href="../../java/lang/String.html" title="class in java.lang">String</a> propertyName,
<a href="../../java/lang/Object.html" title="class in java.lang">Object</a> oldValue,
<a href="../../java/lang/Object.html" title="class in java.lang">Object</a> newValue)</pre>
<div class="block">
<span>向任何已注册的监听器报告绑定属性更新。</span>
<span>如果<code>old</code><code>new</code>相等且非空,则<code>old</code>触发任何事件。</span>
<p> <span><code>SwingWorker</code>将是任何生成的事件的源。</span> </p>
<p> <span>如果取消了<i>事件指派线程</i> <code>PropertyChangeListeners</code>是在<i>事件指派线程</i>上异步地通知。</span> </p>
<p> <span>注意:这只是一个方便的包装。</span> <span>所有工作均由<code>PropertyChangeSupport</code><a href="../../javax/swing/SwingWorker.html#getPropertyChangeSupport--">PropertyChangeSupport</a></span> </p>
</div>
<dl>
<dt>
<span class="paramLabel">参数</span>
</dt>
<dd>
<code>propertyName</code> - 已更改的属性的编程名称
</dd>
<dd>
<code>oldValue</code> - 该属性的旧值
</dd>
<dd>
<code>newValue</code> - 该物业的新值
</dd>
</dl> </li>
</ul> <a name="getPropertyChangeSupport--">
<!-- --> </a>
<ul class="blockList">
<li class="blockList"> <h4>getPropertyChangeSupport</h4> <pre>public final <a href="../../java/beans/PropertyChangeSupport.html" title="class in java.beans">PropertyChangeSupport</a> getPropertyChangeSupport()</pre>
<div class="block">
<span>返回<code>PropertyChangeSupport</code>为这<code>SwingWorker</code></span>
<span>当需要灵活访问绑定属性支持时,使用此方法。</span>
<p> <span><code>SwingWorker</code>将是任何生成的事件的源。</span> </p>
<p> <span>注:返回<code>PropertyChangeSupport</code>通知任何<code>PropertyChangeListener</code>小号异步对事件的<i>事件调度线程</i> <code>firePropertyChange</code><code>fireIndexedPropertyChange</code>被叫停<i>事件指派线程</i></span> </p>
</div>
<dl>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
<code>PropertyChangeSupport</code>为这
<code>SwingWorker</code>
</dd>
</dl> </li>
</ul> <a name="getState--">
<!-- --> </a>
<ul class="blockListLast">
<li class="blockList"> <h4>getState</h4> <pre>public final <a href="../../javax/swing/SwingWorker.StateValue.html" title="enum in javax.swing">SwingWorker.StateValue</a> getState()</pre>
<div class="block">
返回
<code>SwingWorker</code>状态绑定属性。
</div>
<dl>
<dt>
<span class="returnLabel">结果</span>
</dt>
<dd>
当前状态
</dd>
</dl> </li>
</ul> </li>
</ul> </li>
</ul>
</div>
</div>