Bài 8: Tiếp tục cải tiến chương trình
đồ họa liệt kê các số nguyên tố
Lê Hồng Phương,
Nguyễn Việt Hùng, Hà Mỹ Linh
Khoa Toán-Cơ-Tin học
Trường Đại học Khoa học Tự nhiên Hà Nội
Nội dung
●
Tiếp tục cải tiến chương trình liệt kê các số nguyên
tố trong bài giảng trước:
–
Sử dụng cấu trúc dữ liệu List
–
Sử dụng thành phần đồ họa JList
–
Ghi danh sách số nguyên tố vào tệp văn bản
–
Sử dụng hộp thoại chọn tệp JFileChooser
2012-2013
Object-Oriented Programming: IO Streams
2
Nội dung
●
Tiếp tục cải tiến chương trình liệt kê các số nguyên
tố trong bài giảng trước:
–
Sử dụng cấu trúc dữ liệu List
–
Sử dụng thành phần đồ họa JList
–
Ghi danh sách số nguyên tố vào tệp văn bản
–
Sử dụng hộp thoại chọn tệp JFileChooser
2012-2013
Object-Oriented Programming: IO Streams
3
Thêm chức năng
●
●
Thêm mục thực đơn Save trong menu File.
Không còn sử dụng JTextArea để lưu kết quả, thay
vào đó là JList – thích hợp cho việc chứa một danh
sách đối tượng.
–
●
Tiếp cận hướng đối tượng: JList chỉ là thành phần
biểu diễn, mô hình dữ liệu của JList được mô tả
bởi ListModel.
Mục Save chỉ được bật (enabled) nếu danh sách có
chứa dữ liệu. Ban đầu mục Save tắt (disabled).
2012-2013
Object-Oriented Programming: IO Streams
4
Thêm chức năng
2012-2013
Object-Oriented Programming: IO Streams
5
Thêm chức năng
●
Chọn thư mục và tên tệp để lưu kết quả:
2012-2013
Object-Oriented Programming: IO Streams
6
Cấu trúc dữ liệu List
●
List là giao diện biểu diễu kiểu cấu trúc dữ liệu danh sách
–
●
●
●
Sẽ có bài giảng riêng về Collection trong Java.
Có nhiều cách cài đặt List. Lớp ArrayList cài đặt List dưới
dạng mảng.
List có thể chứa dữ liệu tổng quát – các phần tử của List
là bất kì Object nào.
Sử dụng List để chứa các số nguyên:
List<Integer> numbers = new ArrayList<Integer>();
2012-2013
Object-Oriented Programming: IO Streams
7
Cấu trúc dữ liệu List
●
●
Thêm một phần tử (số nguyên) p vào danh sách:
–
numbers.add(p); hoặc
–
numbers.add(new Integer(p));
Duyệt mọi phần tử của danh sách và ghi chúng vào
một luồng ra writer, mỗi số trên một dòng:
for (Integer n : numbers) {
writer.write(n.toString());
writer.write("\n");
}
2012-2013
Object-Oriented Programming: IO Streams
8
Thêm nút Save vào thực đơn
// Save
saveMenuItem = new JMenuItem("Save");
Ban đầu chức năng
saveMenuItem.setMnemonic(KeyEvent.VK_S);
ghi kết quả bị tắt
saveMenuItem.setEnabled(false);
saveMenuItem.addActionListener(new SaveActionListener());
menu.add(saveMenuItem);
Cài đặt chức năng
ghi kết quả
2012-2013
Object-Oriented Programming: IO Streams
9
SaveActionListener
class SaveActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
// open a message dialog to accept a file name from user
JFileChooser fileChooser = new JFileChooser();
int value =
fileChooser.showSaveDialog(PrimeNumberFrame.this);
if (value == JFileChooser.APPROVE_OPTION) {
String fileName =
fileChooser.getSelectedFile().getAbsolutePath();
if (numbers != null) {
PrimeNumberIO.writeList(numbers, fileName);
}
}
}
Ghi danh sách numbers vào
}
một tệp có tên fileName
2012-2013
Object-Oriented Programming: IO Streams
10
EnumeratePrimeNumbersListener
public void actionPerformed(ActionEvent event) {
// ...
// update the prime list
numbers = pn.computePrimeNumbers(n);
DefaultListModel listModel = new DefaultListModel();
for (Integer p : numbers) {
listModel.addElement(p);
}
primeList.setModel(listModel);
// enable the Save action
if (numbers.size() > 0) {
saveMenuItem.setEnabled(true);
} else {
saveMenuItem.setEnabled(false);
}
}
2012-2013
Object-Oriented Programming: IO Streams
11
PrimeNumberIO
public static void writeList(List<Integer> numbers, String fileName) {
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fileName));
for (Integer n : numbers) {
writer.write(n.toString());
Sử dụng tệp văn bản
writer.write("\n");
để lưu dữ liệu
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2012-2013
Object-Oriented Programming: IO Streams
12
Chương trình
●
Xem các tệp mã nguồn trong gói lecture7.primes3
–
LookAndFeelLister.java
–
PrimeNumberApp.java
–
PrimeNumberFrame.java
–
PrimeNumbers.java
–
PrimeNumberIO.java
2012-2013
Object-Oriented Programming: IO Streams
13
Tiếp tục cải tiến chương trình
●
●
●
Chương trình mặc dù đơn giản nhưng vẫn chưa hoàn thiện.
Nếu người dùng nhập vào một số n tương đối lớn, ví dụ
100,000 thì giao diện dường như bị “treo”.
Lí do:
–
●
Cần nhiều thời gian để liệt kê mọi số nguyên tố nhỏ hơn n.
Hướng cải tiến:
–
Sử dụng nhiều luồng (thread) làm việc khác nhau (dùng
cho giao diện, dùng cho logic của chương trình).
–
Sử dụng thành phần đồ họa JProgressBar để thông báo
mức độ hoàn thiện công việc liệt kê số:
2012-2013
Object-Oriented Programming: IO Streams
14