 |
|
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 |