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

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

pdf14 trang | Chia sẻ: thuongdt324 | Lượt xem: 460 | Lượt tải: 0download
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ố: