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
14 trang |
Chia sẻ: thuongdt324 | Lượt xem: 539 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng Lập trình hướng đối tượng - 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, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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
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
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 4
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 5
Thêm chức năng
2012-2013 Object-Oriented Programming: IO Streams 6
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 7
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 8
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 9
Thêm nút Save vào thực đơn
// Save
saveMenuItem = new JMenuItem("Save");
saveMenuItem.setMnemonic(KeyEvent.VK_S);
saveMenuItem.setEnabled(false);
saveMenuItem.addActionListener(new SaveActionListener());
menu.add(saveMenuItem);
Ban đầu chức năng
ghi kết quả bị tắt
Cài đặt chức năng
ghi kết quả
2012-2013 Object-Oriented Programming: IO Streams 10
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 11
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 12
PrimeNumberIO
public static void writeList(List numbers, String fileName) {
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fileName));
for (Integer n : numbers) {
writer.write(n.toString());
writer.write("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Sử dụng tệp văn bản
để lưu dữ liệu
2012-2013 Object-Oriented Programming: IO Streams 13
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 14
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ố: