Tạo ContextMenuStrip trên Java Swing,
Vâng, điều này có thể là quá quen thuộc đối với C# Winform, chúng ta chỉ việc kéo thả, 1 vài dòng code đơn giản là Control/Component của chúng ta có thể sử dụng được rồi.
Tuy nhiên với Java, điều này hơi khó khăn 1 chút, chúng ta phải viết tay và đi đường vòng 😀
Nên hôm nay mình sẽ hướng dẫn các bạn tạo ContextMenuStrip trên Java Swing nhé 😀
Cách tạo ContextMenuStrip trên Java Swing đơn giản:
Ví dụ mình cần tạo contextMenuStrip khi chuột fải cho label sau:
JLabel lblTest = new JLabel("Label TEst");
Để label này có action khi liên quan tới chuột, mình sẽ chủ động dùng addMouseListener, và cụ thể sẽ là MouseAdapter để không bị overwrite toàn bộ method.
Và vụ addMouseListener sau nhé, giờ mình sẽ bắt đầu tạo 1 class contextMenuStrip
1/ Tạo class ContextMenuStrip
Class này sẽ kế thừa từ JPopupMenu, các bạn lưu ý kĩ điều này 😀 (Chúng ta có thể bỏ từ khóa public để có thể chứa nhiều class trong 1 file)
Class ContextMenuStrip:
class ContextMenuStrip extends JPopupMenu { public JMenuItem menu1, menu2, menu3; public ContextMenuStrip() { menu1 = new JMenuItem("Xuất chào"); add(menu1); menu2 = new JMenuItem("Menu thứ 2"); add(menu2); // Thêm thanh ngăn cách addSeparator(); menu3 = new JMenuItem("Menu thứ 3"); add(menu3); } }
Tại sao mình lại dùng public? Cơ bản vì chúng ta tạo trung gian này bị kẹt các bạn ạ. Phải là public thì chúng ta mới tác động và thêm action được. Tuy nhiên đây chỉ là 1 phần nhỏ thôi mà 😀
Xong class ContextMenuStrip, nhưng để hiển thị được thì chúng ta cần fải thêm 1 class nữa (hoặc gộp tùy các bạn).
2/ Class showMenu
Class showMenu này sẽ kế thừa từ MouseAdapter, và chúng ta sẽ xài tới 2 phương thức của MouseAdapter để override là mousePressed và mouseReleased.
Và sau đó ta chỉ cần 1 hàm nhỏ để hiển thị ra ContextMenuStrip thôi 😀
Class showMenu:
class showMenu extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { // Kiểm tra nếu sử dụng chuột fải thì hiển thị if (e.isPopupTrigger()) hienThiMenu(e); } @Override public void mouseReleased(MouseEvent e) { // Kiểm tra nếu sử dụng chuột fải thì hiển thị if (e.isPopupTrigger()) hienThiMenu(e); } /* * Hàm hiển thị contextMenuStrip */ private void hienThiMenu(MouseEvent e) { // Khởi tạo ContextMenuStrip ContextMenuStrip cmsMenu = new ContextMenuStrip(); // Hiển thị menu ngay chuột cmsMenu.show(e.getComponent(), e.getX(), e.getY()); } }
Rất đơn giản phải ko nào, bước 3, chúng ta sẽ để label hiển thị contextMenuStrip khi nhấp chuột phải 😀
3/ Hiển thị ContextMenuStrip khi nhấp chuột phải.
Về class showMenu, mình đã cho nó chỉ hiển thị khi click chuột phải 😀 Bây giờ việc chúng ta chỉ cần thêm action thôi 😀
Ở đây label mình sẽ dùng tới addMouseListener:
lblTest.addMouseListener(new showMenu());
Chỉ đơn giản là new cái class showMenu thôi 😀
4/ Chạy thử – test
Đã hiện rồi các bạn ạ, tuy nhiên thì vẫn chưa có thêm action gì cho các menu cả 😀
5/ Thêm action cho từng Menu
Giờ bạn sẽ hiểu tại sao mình lại để public cho JMenuItem phải ko? Để bây giờ chúng ta thêm action cho nó đấy 😀
Ví dụ action xuất câu chào là từ JMenuItem menu1
Tiếp tục ở hàm hienThiMenu:
private void hienThiMenu(MouseEvent e) { // Khởi tạo ContextMenuStrip ContextMenuStrip cmsMenu = new ContextMenuStrip(); // Tạo action cho menu1 cmsMenu.menu1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // Xuất câu chào JOptionPane.showMessageDialog(null, "Xin chào các bạn đã tới SethPhat.com"); } }); // Hiển thị menu ngay chuột cmsMenu.show(e.getComponent(), e.getX(), e.getY()); }
Tương tự với các menu khác nhé :D, chạy thử:
Thành công rồi nhé 😀
Download code full tham khảo:
Các bạn có thể download code của mình để tham khảo tại đây: https://codeshare.io/GqnAPx
Cám ơn các bạn đã quan tâm và chúc các bạn làm bài tốt 😀