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 numbers, String fileName) {

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