2011-07-05 31 views
8

Triển khai "Góc 'của các Vua" (Solitaire nhiều người được tôn vinh) trong Java.Làm cách nào bạn có thể phát hiện sự kiện nhấp chuột trên đối tượng Hình ảnh trong Java?

Tôi đang cố gắng cho phép người chơi kéo thẻ (hình ảnh) từ tay họ đến một nơi khác trên bàn. Vấn đề là bàn tay của người chơi bị "rám nắng" để hình ảnh của các lá bài được xoay và chúng trùng nhau.

Dưới đây là một ví dụ về một bàn tay:

enter image description here

tôi đã coi là làm cho mỗi thẻ một JPanel, nhưng vấn đề sau đó là tôi sẽ phải sơn thẻ xoay bên trong của nó hình chữ nhậtJPanel vì bản thân chúng không thể xoay được. Lý tưởng nhất là tôi muốn tránh các công thức chuột-x, y để xác định loại thẻ nào đang được chọn.

Sử dụng phương pháp tiếp cận theo hướng sự kiện, làm thế nào tôi có thể xác định loại thẻ nào được chọn từ tay?

+4

Hm, cách sử dụng một hoặc nhiều lớp bê tông bắt nguồn từ giao diện Hình dạng? Điều này có một phương pháp có chứa mà sẽ có ích. Xoay sẽ dễ dàng cho mỗi lần sử dụng AffineTransform. –

Trả lời

5

Các thành phần AWT (và Swing) thường là hình chữ nhật (được căn chỉnh theo trục).

Nhưng điều này không phải là trường hợp - trong khi giới hạn thực phải là hình chữ nhật, vùng thực tế mà thành phần sử dụng có thể nhỏ hơn. Thành phần hỗ trợ phương thức contains(Point), sẽ được gọi bởi cơ chế gửi sự kiện bất cứ khi nào câu hỏi phát sinh thành thành phần nào thuộc điểm - ví dụ, đối với các lần nhấp chuột. (Chồng chéo các thành phần khác nhau sẽ được xử lý theo thứ tự z bên trong vùng chứa chính.)

Bạn có thể triển khai phương pháp này dựa trên phương pháp Shape.contains(). Mỗi thành phần xoay của bạn sẽ biết hình dạng riêng của nó (hoặc tạo ra nó trên bay từ AffineTransform của nó, cùng một thành phần cũng sẽ được sử dụng để vẽ chính nó).

Có Trình quản lý bố cục tùy chỉnh sắp xếp thẻ của bạn. (Không sử dụng CardLayout, mặc dù tên.)

Tôi không chắc chắn tôi sẽ làm theo cách có các thành phần riêng biệt cho mỗi thẻ, nhưng bạn chắc chắn cần một số đối tượng đại diện cho hình chữ nhật xoay.

+0

Làm việc hoàn hảo. Giải pháp là sử dụng createTransformedShape của AffineTransform và sau đó kiểm tra xem hình dạng đó có chứa Điểm nhấp chuột hay không. Cảm ơn. – rtheunissen

+0

@ paranoid-android: Bạn nên chấp nhận câu trả lời này bằng cách nhấp vào dấu tick ở bên trái của câu trả lời này. –

+0

@Martijn Courteaux: Và vì vậy chúng tôi tìm hiểu. Cảm ơn. – rtheunissen

Các vấn đề liên quan