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 phuonglh@gmail.com 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 numbers = new ArrayList();
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:
● Duyệt mọi phần tử của danh sách và ghi chúng vào
– numbers.add(p); hoặc – numbers.add(new Integer(p));
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
Ban đầu chức năng ghi kết quả bị tắt
// Save saveMenuItem = new JMenuItem("Save"); saveMenuItem.setMnemonic(KeyEvent.VK_S); saveMenuItem.setEnabled(false); saveMenuItem.addActionListener(new SaveActionListener()); menu.add(saveMenuItem);
2012-2013
Object-Oriented Programming: IO Streams
9
Cài đặt chức năng ghi kết quả
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);
}
}
}
2012-2013
Object-Oriented Programming: IO Streams
10
Ghi danh sách numbers vào một tệp có tên fileName }
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
BufferedWriter writer = null; try {
writer = new BufferedWriter(new FileWriter(fileName)); for (Integer n : numbers) {
writer.write(n.toString()); writer.write("\n");
Sử dụng tệp văn bả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