更新時(shí)間:2022-10-31 10:09:17 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2633次
有時(shí),在程序中運(yùn)行的任務(wù)可能需要一段時(shí)間才能完成。用戶友好的程序向用戶提供一些指示,表明任務(wù)正在發(fā)生、任務(wù)可能需要多長(zhǎng)時(shí)間以及已經(jīng)完成了多少工作。一種表示工作的方式,也許是進(jìn)度量,是使用動(dòng)畫圖像。
另一種指示工作的方法是使用 Cursor類和Component-defined setCursor方法設(shè)置等待光標(biāo)。例如,以下代碼使等待光標(biāo)在光標(biāo)結(jié)束時(shí)顯示container(包括它包含的任何未指定光標(biāo)的組件):
container.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
要傳達(dá)任務(wù)的完成程度,您可以使用如下進(jìn)度條:
有時(shí)您無法立即確定長(zhǎng)時(shí)間運(yùn)行的任務(wù)的長(zhǎng)度,或者該任務(wù)可能會(huì)長(zhǎng)時(shí)間停留在相同的完成狀態(tài)。您可以通過將進(jìn)度條置于不確定模式來顯示沒有可測(cè)量進(jìn)度的工作。不確定模式下的進(jìn)度條會(huì)顯示動(dòng)畫以指示工作正在進(jìn)行。一旦進(jìn)度條可以顯示更有意義的信息,您應(yīng)該將其切換回其默認(rèn)的確定模式。在 Java 外觀中,不確定的進(jìn)度條如下所示:
Swing 提供了三個(gè)類來幫助您使用進(jìn)度條:
JProgressBar
一個(gè)可視組件,以圖形方式顯示總?cè)蝿?wù)已完成多少。使用不確定模式部分告訴您如何在任務(wù)范圍已知之前為進(jìn)度條設(shè)置動(dòng)畫以顯示活動(dòng)。
ProgressMonitor
不是可見組件。相反,此類的一個(gè)實(shí)例監(jiān)視任務(wù)的進(jìn)度并在必要時(shí)彈出一個(gè)對(duì)話框。
ProgressMonitorInputStream
帶有附加進(jìn)度監(jiān)視器的輸入流,它監(jiān)視從流中讀取的內(nèi)容。您可以像使用Basic I/O中描述的任何其他輸入流一樣使用此流的實(shí)例 。您可以通過調(diào)用來獲取流的進(jìn)度監(jiān)視器,getProgressMonitor并按照如何使用進(jìn)度監(jiān)視器中的說明對(duì)其進(jìn)行配置。
在您看到正在運(yùn)行的進(jìn)度條和進(jìn)度監(jiān)視器后,決定是使用進(jìn)度條還是進(jìn)度監(jiān)視器可以幫助您確定哪個(gè)適合您的應(yīng)用程序。
這是一個(gè)小型演示應(yīng)用程序的圖片,它使用進(jìn)度條來測(cè)量在自己的線程中運(yùn)行的任務(wù)的進(jìn)度:
//聲明成員變量的地方:
JProgressBar 進(jìn)度條;
...
//GUI的構(gòu)建位置:
progressBar = new JProgressBar(0, task.getLengthOfTask());
進(jìn)度條.setValue(0);
progressBar.setStringPainted(true);
創(chuàng)建進(jìn)度條的構(gòu)造函數(shù)設(shè)置進(jìn)度條的最小值和最大值。您還可以使用setMinimum和設(shè)置這些值setMaximum。這個(gè)程序中使用的最小值和最大值是 0 和任務(wù)的長(zhǎng)度,這是許多程序和任務(wù)的典型特征。但是,進(jìn)度條的最小值和最大值可以是任何值,甚至是負(fù)值。該代碼段還將進(jìn)度條的當(dāng)前值設(shè)置為 0。
調(diào)用setStringPainted使進(jìn)度條在其范圍內(nèi)顯示已完成任務(wù)百分比的文本指示。默認(rèn)情況下,進(jìn)度條顯示其getPercentComplete方法返回的值,格式為百分比,例如33%。或者,您可以通過調(diào)用將默認(rèn)值替換為不同的字符串setString。例如,
if ( /*...完成一半...*/ )
progressBar.setString("到了一半!");
當(dāng)用戶單擊StartTask時(shí),會(huì)創(chuàng)建并執(zhí)行內(nèi)部類的一個(gè)實(shí)例。
公共無效actionPerformed(ActionEvent evt){
startButton.setEnabled(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
完成=假;
任務(wù)=新任務(wù)();
task.addPropertyChangeListener(this);
任務(wù).執(zhí)行();
}
Task的子類是 javax.swing.SwingWorker。該Task實(shí)例為 做三件重要的事情ProgressBarDemo:
該實(shí)例doInBackground在單獨(dú)的線程中調(diào)用 。這是實(shí)際執(zhí)行長(zhǎng)時(shí)間運(yùn)行的任務(wù)的地方。使用后臺(tái)線程而不是事件調(diào)度線程可以防止用戶界面在任務(wù)運(yùn)行時(shí)凍結(jié)。
當(dāng)后臺(tái)任務(wù)完成時(shí),實(shí)例調(diào)用done事件調(diào)度線程中的方法。
該實(shí)例維護(hù)一個(gè)綁定屬性 ,progress該屬性已更新以指示任務(wù)的進(jìn)度。propertyChange每次progress更改時(shí)都會(huì)調(diào)用該方法。
有關(guān) . _ _ _ SwingWorker_
后臺(tái)任務(wù)ProgressBarDemo通過以隨機(jī)間隔報(bào)告隨機(jī)進(jìn)度量來模擬真實(shí)任務(wù)。該方法通過更新進(jìn)度條propertyChange來響應(yīng)任務(wù)屬性的變化:progress
公共無效propertyChange(PropertyChangeEvent evt){
如果(!完成){
int 進(jìn)度 = task.getProgress();
進(jìn)度條.setValue(進(jìn)度);
taskOutput.append(String.format(
"已完成 %d%% 的任務(wù)。\n", 進(jìn)度));
}
后臺(tái)任務(wù)完成后,任務(wù)的done方法重置進(jìn)度條:
公共無效完成(){
//告訴進(jìn)度監(jiān)聽器停止更新進(jìn)度條。
完成=真;
Toolkit.getDefaultToolkit().beep();
startButton.setEnabled(true);
設(shè)置游標(biāo)(空);//關(guān)閉等待光標(biāo)
progressBar.setValue(progressBar.getMinimum());
taskOutput.append("完成!\n");
}
請(qǐng)注意,該done方法將done字段設(shè)置為true,以防止propertyChange對(duì)進(jìn)度條進(jìn)行進(jìn)一步更新。這是必要的,因?yàn)閜rogress屬性的最終更新可能發(fā)生在done調(diào)用之后。
設(shè)置為ProgressBarDemo2不確定模式,直到實(shí)際進(jìn)度開始:
公共無效propertyChange(PropertyChangeEvent evt){
如果(!完成){
int 進(jìn)度 = task.getProgress();
如果(進(jìn)度== 0){
progressBar.setIndeterminate(true);
taskOutput.append("還沒有進(jìn)展\n");
} 別的 {
progressBar.setIndeterminate(false);
進(jìn)度條.setString(null);
進(jìn)度條.setValue(進(jìn)度);
taskOutput.append(String.format(
"已完成 %d%% 的任務(wù)。\n", 進(jìn)度));
}
}
}
代碼中的其他更改與字符串顯示有關(guān)。顯示字符串的進(jìn)度條可能比不顯示字符串的進(jìn)度條要高,并且,作為演示設(shè)計(jì)者,我們已經(jīng)武斷地決定該進(jìn)度條應(yīng)該僅在默認(rèn)的確定模式下顯示字符串。但是,我們希望避免在更改模式時(shí)進(jìn)度條更改高度可能導(dǎo)致的布局丑陋。因此,代碼保留在調(diào)用中,setStringPainted(true)但添加了調(diào)用,setString("")因此不會(huì)顯示任何文本。稍后,當(dāng)進(jìn)度條從不確定模式切換到確定模式時(shí),調(diào)用setString(null)會(huì)使進(jìn)度條顯示其默認(rèn)字符串。
我們沒有做的一項(xiàng)更改是progressBar.setValue從progress事件處理程序中刪除調(diào)用。該調(diào)用不會(huì)造成任何傷害,因?yàn)椴淮_定的進(jìn)度條不使用其 value 屬性,除非可能將其顯示在狀態(tài)字符串中。事實(shí)上,讓進(jìn)度條的數(shù)據(jù)盡可能保持最新是一種很好的做法,因?yàn)槟承┩庥^可能不支持不確定模式。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743