Tạo ContextMenuStrip trên Java Swing

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

ContextMenuStrip trên Java Swing
ContextMenuStrip trên Java Swing

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

ContextMenuStrip trên Java Swing
ContextMenuStrip trên Java Swing

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 😀

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook