Tải bản đầy đủ (.pdf) (14 trang)

Bài giả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ố

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (197.86 KB, 14 trang )

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



×