หลายท่านคงเคยเห็นว่าบางโปรแกรมจะสามารถแสดง Icon บน Taskbar ได้ ซึ่ง Icon ดังกล่าวเราเรียกว่า โปรแกรมที่สร้างด้วยจาวา ก็สามารถสร้าง TrayIcon ได้เช่นกัน โดย Java SE 6 นั้น ได้ออก API ใหม่ที่รองรับการสร้าง TrayIcon ด้วย ดังนั้นผู้ที่ต้องการทดลองตามบทความนี้จะต้องลง Java SE 6 ก่อนนะครับ
จากนั้นขอให้สร้างโปรเจคแบบ Application บน NetBeans (อย่าลืมเอา checkbox ที่เขียน create main class ออกด้วยนะครับ) แล้วให้สร้างฟอร์มใหม่แบบ Frame และให้เพิ่มปุ่มเข้าไปดังรูป

หลังจากนั้นให้นำ Popup Menu จากหน้าต่าง Palette ภายในกลุ่ม AWT มาวางในฟอร์ม ขอย้ำว่าต้องเป็น AWT นะครับ เราไม่สามารถใช้ Swing ได้เนื่องจาก API นี้ยังไม่รองรับการทำงาน
เราจะพบว่ามี component เพิ่มเข้ามาในหน้าต่าง Inspector ขอให้เปลี่ยนชื่อตัวแปรเป็น pop ดังรูป

จากนั้นให้เราคลิกขวาที่ pop แล้วเลือก Add->MenuItem แล้วทำแบบเดิมแต่ให้เลือก Separator แทน จากนั้นให้เพิ่ม MenuItem อีกครั้งจะได้ดังรูป

ต่อมาให้เราคลิกขวาที่ pop แล้วเลือก properties จากนั้นให้แก้ไข label เป็น Tray Icon Menu ดังรูป

แล้วให้เราคลิกขวาที่ menuItem1 แล้วเลือก properties จากนั้นให้แก้ไข label เป็น Restore ดังรูป

ในทำนองเดียวกัน ให้เราแก้ไข label ของ menuItem2 เป็น Exit จากนั้นให้เราสร้าง event สำหรับ menu ทั้ง 2 แล้วเพิ่มโค้ดดังนี้
private void menuItem2ActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("Exiting...");
System.exit(0);
}
ฟังชั่นนี้ใช้ปิดโปรแกรมเมื่อเราคลิกเมนู Exit
private void menuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(true);
}
ฟังชั่นข้างบนใช้เพื่อให้ Frame กลับมาแสดงอีกครั้ง หลังจากเราได้ซ่อนเอาไว้ แล้วให้เราสร้าง event ของปุ่ม ที่เราสร้างตอนแรกดังนี้
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
trayIcon.setToolTip("Try Click Me or Right Click");
}
ฟังชั่นข้างบนนี้ใช้ในการซ่อน Frame เมื่อเราคลิกที่ปุ่ม แล้วเปลี่ยนค่าที่ใช้ในการแสดง ToolTip และให้เราสร้าง event ของฟอร์มชนิด WindowActivated ดังนี้
private void formWindowActivated(java.awt.event.WindowEvent evt) {
trayIcon.setToolTip("Tray Demo");
}
จากนั้นขอให้ผู้อ่านเพิ่มตัวแปรแบบ Global ดังนี้
TrayIcon trayIcon;
ต่อจากนั้นให้เราเพิ่มโค้ดเข้าไปใน constructor ดังนี้
public NewJFrame() {
initComponents();
trayicon_init();
}
เราจะพบว่า NetBeans ได้เตือนเราว่าเกิดความผิดพลาดขึ้น ถ้าเราคลิกที่รูปหลอดไฟด้านซ้ายมือ เราจะเห็นว่า NetBeans แนะนำให้เราสร้าง method trayicon_init() ขอให้ผู้อ่านคลิกตามที่ NetBeans ได้แนะนำดังรูป

แล้วให้เพิ่มโค้ดเข้าไปใน method ใหม่ดังนี้
private void trayicon_init() {
if (SystemTray.isSupported()) {
/* สร้างตัวแปร SystemTray และรูปที่จะแสดงบน Taskbar */
SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");
/* สร้าง event สำหรับการคลิก mouse บน TrayIcon */
MouseListener mouseListener = new MouseListener() {
public void mouseClicked(MouseEvent e) {
System.out.println("Tray Icon - Mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("Tray Icon - Mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("Tray Icon - Mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("Tray Icon - Mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("Tray Icon - Mouse released!");
}
};
/* นำทุกอย่างมารวมกัน พร้อมทั้งกำหนดข้อความที่จะแสดงบน TrayIcon */
trayIcon = new TrayIcon(image, "Tray Demo", pop);
/* เราสามารถกำหนดให้รูป หด-ขยาย ได้โดยอัตโนมัติ */
trayIcon.setImageAutoSize(true);
/* เพิ่ม event ของ mouse เข้ามาใน TrayIcon */
trayIcon.addMouseListener(mouseListener);
/* เพิ่ม TrayIcon เข้าไปในระบบ */
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println("TrayIcon could not be added.");
}
} else {
// System Tray is not supported
}
}
สุดท้ายนี้ให้เราสำเนาไฟล์รูปที่จะใช้เป็น TrayIcon ไปไว้ภายในโปรเจคของเรา ในตัวอย่างนี้ไฟล์รูปมีชื่อ tray.gif แล้วทดลองรันโปรแกรมดูก็จะได้ตามต้องการ หากท่านต้องการตัวอย่างโปรเจค NetBeans สามารถดาวโหลดได้ ที่นี่