Find()
方法是我的方法的一个示例,它将单词搜索到一些文件中。
我是通过Button_Start
鼠标点击事件来称呼的
这是我的代码:
public void Find (String word) {
List_files_directories (directory.getAbsolutePath(), files);
// print list
textpane.append(java.awt.Color.cyan, "Files in the choosen directory\n");
for (int j=0; j<files.size(); j++) {
if (files.get(j) != null)
textpane.append( java.awt.Color.PINK, "\n" + files.get(j) );
}
// from listarray to array
String[] array_files = new String[files.size()];
array_files = files.toArray(array_files);
int j;
for (j=0; j<array_files.length; j++) {
if (array_files[j] != null) {
if (array_files[j].contains("1")) {
function1 ( array_files[j], word );
}
else if ( array_files[j].contains("2") )
{
function2 ( array_files[j], word);
}
else if ( array_files[j].contains("3") )
{
function3 ( array_CARTELLE[j], word );
}
}
}
}
private void Button_StartMouseClicked(java.awt.event.MouseEvent evt) {
java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
Find(word_from_textfield);
}
},
10
);
}
我需要添加两件事:
JProgressBar
方法正在运行时,我想制作Find()
在这种情况下,我需要采用一个标准来设置栏的进度
即根据文件列表长度,我不知道。WAIT_CURSOR
方法正在运行时设置Find()
,所以直到
进度条达到100%。我为我的请求尝试了这个1):
public void doWork() {
Worker worker = new Worker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
ProgressBar1.setValue((Integer) evt.getNewValue());
}
}
});
worker.execute();
}
public class Worker extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
for (int index = 1; index <= 1000; index++) {
int progress = Math.round(((float) index / 1000) * 100f);
setProgress(progress);
Thread.sleep(100);
}
return null;
}
}
在此,我在doWork()
方法的开头致电Find()
。
问题是我不知道如何同步我的方法持续时间和进度条长度。
此外,我不知道这是否是实现目标的最佳途径。
请你帮我根据我的代码/情况给出一个例子吗?
由于
编辑:这是我的目标:我的方法在JTextPane
(textpane.append()
)打印用户目录中的所有文件,然后在每个文件中搜索一个单词。
我想在JrogxtPane上打印时使用JProgressBar,它必须与进程持续时间同步。
如果可能的话必须定时打印:
示例:
// Set Mouse cursor to Wait Status
// execute Find():
// the JProgressBar has to follow this progress of the print on JTextPane.
Files in the choosen directory:
file1
// print on JTextPane after 1 second
file2
// print on JTextPane after 1 second
file3
// print on JTextPane after 1 second
word found in file1!
// print on JTextPane after 1 second
word not found in file2
// print on JTextPane after 1 second
word found in file3
// print on JTextPane after 1 second
// restore mouse cursor to default
答案 0 :(得分:2)
我认为您需要将Find()完成的工作集成到SwingWorker中。然后,您可以在处理完每个文件后设置进度条。
@Override
protected Object doInBackground() throws Exception {
for (int j=0; j<files.size(); j++) {
if (files.get(j) != null)
textpane.append( java.awt.Color.PINK, "\n" + files.get(j) );
}
// from listarray to array
String[] array_files = new String[files.size()];
array_files = files.toArray(array_files);
int j;
for (j=0; j<array_files.length; j++) {
if (array_files[j] != null) {
if (array_files[j].contains("1")) {
function1 ( array_files[j], word );
}
else if ( array_files[j].contains("2") )
{
function2 ( array_files[j], word);
}
else if ( array_files[j].contains("3") )
{
function3 ( array_CARTELLE[j], word );
}
// THIS IS THE NEW BIT
setProgress((int)(100 * (float) j / files.size()));
}
}
答案 1 :(得分:2)
什么是
publish()
?我不明白我必须做什么。
方法publish()
和process()
让SwingWorker
可以正确地将<{3}} 从后台线程传递到事件派遣线程(EDT)。在此interim results中,process()
显示长时间运行计算的当前结果;在此相关的example中,process()
也会更新图表的数据模型。
附录:正如@mKorbel所说,您可以通过使用更具体的类型来利用泛型类型检查,例如: SwingWorker<Double, Double>
。