Tìm trong:Webe-CHÍP

Bộ gõ (kiểu Vni/Telex/Viqr)Tắt (Alt+T)Mở (Alt+M)

 
Trang chủ QUÁN LẬP TRÌNH  
Hiển thị nhiều hình trong chương trình Slide Show
Xin chào các bạn! Ở bài trước, ta đã biết cách thức hiển thị hình ảnh. Hôm nay, ta sẽ thử lấy một danh sách các hình ảnh và lần lượt hiển thị mỗi hình ảnh trong một khoảng thời gian nào đó. Sau khi khoảng thời gian đó trôi qua, chương trình lại cho hiện lên ảnh kế tiếp trong chuỗi hình. Để cho đơn giản, trong ví dụ này tất cả các ảnh đều có khoảng thời gian hiển thị như nhau (đây cũng là đặc điểm của hầu hết chương trình xem ảnh) và không có hiệu ứng chuyển tiếp từ ảnh này sang ảnh khác (ví dụ như làm mờ ảnh cũ hoặc cuộn ảnh, v.v...). Sau đây là cài đặt cụ thể cho từng bước của chương trình.
Lưu danh sách ảnh
Do chúng ta muốn hiển thị nhiều ảnh, nên phải có cách thức để lưu danh sách ảnh. Ở đây tôi dùng một ArrayList (nằm trong gói java.util) như sau:
ArrayList imgs = new ArrayList();
Ngoài ra, chương trình còn phải biết đang hiển thị ảnh ở vị trí thứ mấy để có thể trình bày ảnh kế tiếp. Do đó tôi dùng thêm một biến nguyên index để lưu trữ vị trí hiện tại:
int index = 0;
Ta bắt đầu từ ảnh đầu tiên nên tôi đã khởi tạo index bằng trị 0.
Đưa các ảnh vào ArrayList
Trong ví dụ này, để đơn giản tôi cho nhập danh sách ảnh trực tiếp trong chương trình. Dĩ nhiên, các chức năng thêm, bớt, định vị các ảnh cần được thực hiện thông qua giao diện của chương trình (ta không thể bắt người sử dụng phải đọc và sửa chương trình!). Đoạn mã lấy các tập tin ảnh như sau:
Image img1=ImageIO.read(new File("C:\\Sample Pictures\\Blue hills.jpg"));
imgs.add(img1);

Image img2=ImageIO.read(new File("C:\\Sample Pictures\\Sunset.jpg"));
imgs.add(img2);

...
Hiển thị ảnh
Trong chương trình này, tôi cho ảnh hiển thị xoay vòng, tức là sau khi hiển thị xong ảnh cuối cùng thì lại quay về ảnh đầu tiên. Để thực hiện việc hiển thị, tôi tạo một Thread mới có nhiệm vụ hiển thị lần lượt các ảnh. Tại sao chúng ta phải tạo một Thread mới? Nếu chúng ta để Thread hiện tại thực hiện luôn việc hiển thị thì rõ ràng nó sẽ rất bận rộn và không thể xử lý các công việc khác được. Sau đây là khai báo lớp trong chương trình:
public class MainFrame extends JFrame implements Runnable
Lớp này cài đặt giao diện Runnable nên sẽ có khả năng thực thi phương thức run() trong một Thread mới. Cách cài đặt của phương thức run() được trình bày ở đoạn mã 1.
Đoạn mã 1
public void run()
{
while(true)
{
Image img =(Image)imgs.get(index);
gr.drawImage(img,0,0,null);
index++;
index=index % imgs.size();
try
{
Thread.currentThread().sleep(3000);
}
catch(InterruptedException ine)
{
}
}
}
Đây là một vòng lặp vô tận (do điều kiện đưa ra trong while(true) là luôn đúng), nên việc hiển thị hình ảnh sẽ tiếp diễn mãi cho đến khi người dùng thoát chương trình. Các bạn nên thêm vào các chức năng như pause, stop, restart để chương trình trở nên hữu ích hơn. Trong thân vòng lặp, đầu tiên ta lấy ra hình ảnh tại vị trí lưu trong biến index. Do phương thức get() trong lớp ArrayList trả về đối tượng Object nên ta cần chuyển sang kiểu Image trước khi cho hiển thị lên. Sau khi hiển thị xong, tôi cho tăng biến index lên để trỏ đến ảnh kế tiếp. Khi index tăng vượt quá kích thước của ArrayList, ta cho index xoay vòng lại bằng dòng lệnh index = index % imgs.size(). Để việc hiển thị không diễn ra quá nhanh, sau mỗi lần hiển thị, Thread sẽ chờ trong 3 giây (3000 mi-li-giây) bằng phương thức sleep(). Các bạn nên cho phép người sử dụng quy định thời gian chờ.
Phần cốt lõi như vậy là xong. Để chạy Slide Show, chỉ việc khởi động Thread hiển thị:
Thread t = new Thread(this);
t.start();
Hi vọng các bạn có thể hoàn thành được chương trình SlideShow của mình và có nhiều cải tiến để chương trình hấp dẫn hơn. Sau khi làm xong chương trình SlideShow, các bạn đừng quên gửi cho chúng tôi để tham gia cuộc thi “Đầu bếp quán lập trình” và nhận các phần quà thú vị. Chúc các bạn thành công!
ĐẶNG TRẦN TRÍ
NIIT Hoasen Faculty

Đầu trang