Hướng dẫn và ví dụ Java SWT ProgressBar
1. SWT ProgressBar
ProgressBar là một thành phần giao diện mô tả trực quan tiến độ của một công việc trong ứng dụng SWT.
Hình dưới đây minh họa 3 ProgressBar, hai ProgressBar đầu tiên mô tả tiến độ của một công việc có khối lượng xác định. ProgressBar cuối cùng mô tả tiến độ của một công việc không xác định được thời điểm kết thúc.
ProgressBar thẳng đứng:
Các style có thể áp dụng cho ProgressBar:
- SMOOTH
- HORIZONTAL
- VERTICAL
- INDETERMINATE
// ProgressBar nằm ngang
ProgressBar progressBar1 = new ProgressBar(shell, SWT.NULL);
ProgressBar progressBar2 = new ProgressBar(shell, SWT.SMOOTH);
ProgressBar progressBar3 = new ProgressBar(shell, SWT.INDETERMINATE);
// ProgressBar thẳng đứng
ProgressBar progressBar4 = new ProgressBar(shell, SWT.VERTICAL | SWT.SMOOTH);
2. Ví dụ với SWT ProgressBar
Ví dụ tạo các ProgressBar với các style khác nhau:
ProgressDemo.java
package org.o7planning.swt.progressbar;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
public class ProgressBarDemo {
public ProgressBarDemo() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("SWT ProgressBar (o7planning.org)");
shell.setSize(450, 200);
ProgressBar progressBar1 = new ProgressBar(shell, SWT.NULL);
ProgressBar progressBar2 = new ProgressBar(shell, SWT.SMOOTH);
ProgressBar progressBar3 = new ProgressBar(shell, SWT.INDETERMINATE);
progressBar1.setMinimum(30);
progressBar1.setMaximum(250);
progressBar1.setSelection(160);
progressBar2.setMinimum(30);
progressBar2.setMaximum(250);
progressBar2.setSelection(200);
progressBar1.setBounds(140, 10, 200, 20);
progressBar2.setBounds(140, 40, 200, 20);
progressBar3.setBounds(140, 70, 200, 20);
Label label1 = new Label(shell, SWT.NULL);
label1.setText("(default)");
Label label2 = new Label(shell, SWT.NULL);
label2.setText("SWT.SMOOTH");
Label label3 = new Label(shell, SWT.NULL);
label3.setText("SWT.INDETERMINATE");
label1.setAlignment(SWT.RIGHT);
label2.setAlignment(SWT.RIGHT);
label3.setAlignment(SWT.RIGHT);
label1.setBounds(10, 10, 120, 20);
label2.setBounds(10, 40, 120, 20);
label3.setBounds(10, 70, 120, 20);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(String[] args) {
new ProgressBarDemo();
}
}
3. ProgressBar và Thread
Bạn có thể tạo ra một luồng (Thread) để thực hiện một nhiệm vụ nào đó, chẳng hạn copy danh sách các file. Việc copy đòi hỏi mất một thời gian, bạn cần sử dụng ProgressBar để hiển thị phần trăm công việc đã làm được.
ProgressBarCopyDemo.java
package org.o7planning.swt.progressbar;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
public class ProgressBarCopyDemo {
private CopyThread copyThread = null;
public ProgressBarCopyDemo() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("SWT ProgressBar (o7planning.org)");
shell.setSize(450, 200);
shell.setLayout(null);
ProgressBar progressBar = new ProgressBar(shell, SWT.NONE);
progressBar.setBounds(10, 23, 350, 17);
Label labelInfo = new Label(shell, SWT.NONE);
labelInfo.setBounds(10, 46, 350, 15);
labelInfo.setText(" ...");
// Button Copy
Button buttonCopy = new Button(shell, SWT.NONE);
buttonCopy.setBounds(122, 67, 75, 25);
buttonCopy.setText("Copy");
// Button Cancel
Button buttonCancel = new Button(shell, SWT.NONE);
buttonCancel.setBounds(200, 67, 75, 25);
buttonCancel.setText("Cancel");
buttonCancel.setEnabled(false);
buttonCopy.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
copyThread = new CopyThread(display, progressBar, labelInfo, buttonCopy, buttonCancel);
copyThread.start();
}
});
buttonCancel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (copyThread != null) {
copyThread.cancel();
}
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(String[] args) {
new ProgressBarCopyDemo();
}
}
CopyThread.java
package org.o7planning.swt.progressbar;
import java.io.File;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
public class CopyThread extends Thread {
private Display display;
private ProgressBar progressBar;
private Button buttonCopy;
private Button buttonCancel;
private Label labelInfo;
private boolean cancel;
public CopyThread(Display display, ProgressBar progressBar, //
Label labelInfo, Button buttonCopy, Button buttonCancel) {
this.display = display;
this.progressBar = progressBar;
this.buttonCopy = buttonCopy;
this.buttonCancel = buttonCancel;
this.labelInfo = labelInfo;
}
@Override
public void run() {
if (display.isDisposed()) {
return;
}
this.updateGUIWhenStart();
// Copy All file In C:/Windows
File dir = new File("C:/Windows");
File[] files = dir.listFiles();
int count = files.length;
int i = 0;
for (File file : files) {
if (cancel) {
break;
}
i++;
if (file.isFile()) {
this.copy(file);
} else {
continue;
}
this.updateGUIInProgress(file, i, count);
}
this.updateGUIWhenFinish();
}
private void copy(File file) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
private void updateGUIWhenStart() {
display.asyncExec(new Runnable() {
@Override
public void run() {
buttonCopy.setEnabled(false);
buttonCancel.setEnabled(true);
}
});
}
private void updateGUIWhenFinish() {
display.asyncExec(new Runnable() {
@Override
public void run() {
buttonCopy.setEnabled(true);
buttonCancel.setEnabled(false);
progressBar.setSelection(0);
progressBar.setMaximum(1);
if (cancel) {
labelInfo.setText("Cancelled!");
} else {
labelInfo.setText("Finished!");
}
}
});
}
private void updateGUIInProgress(File file, int value, int count) {
display.asyncExec(new Runnable() {
@Override
public void run() {
labelInfo.setText("Copying file: " + file.getAbsolutePath());
progressBar.setMaximum(count);
progressBar.setSelection(value);
}
});
}
public void cancel() {
this.cancel = true;
}
}
Các hướng dẫn lập trình Java SWT
- Hướng dẫn và ví dụ Java SWT FillLayout
- Hướng dẫn và ví dụ Java SWT RowLayout
- Hướng dẫn và ví dụ Java SWT SashForm
- Hướng dẫn và ví dụ Java SWT Label
- Hướng dẫn và ví dụ Java SWT Button
- Hướng dẫn và ví dụ Java SWT Toggle Button
- Hướng dẫn và ví dụ Java SWT Radio Button
- Hướng dẫn và ví dụ Java SWT Text
- Hướng dẫn và ví dụ Java SWT Password Field
- Hướng dẫn và ví dụ Java SWT Link
- Lập trình ứng dụng Java Desktop sử dụng SWT
- Hướng dẫn và ví dụ Java SWT Combo
- Hướng dẫn và ví dụ Java SWT Spinner
- Hướng dẫn và ví dụ Java SWT Slider
- Hướng dẫn và ví dụ Java SWT Scale
- Hướng dẫn và ví dụ Java SWT ProgressBar
- Hướng dẫn và ví dụ Java SWT TabFolder và CTabFolder
- Hướng dẫn và ví dụ Java SWT List
Show More