2009-04-30 26 views
7

Tôi cần phải gửi một số sự kiện đến một thành phần trong Swing, do đó, nó được xử lý giống như bất kỳ người dùng tạo ra, các sự kiện Swing tiêu chuẩn.Swing: Cách tạo Sự kiện và gửi chúng đến một thành phần?

Về cơ bản, một cái gì đó giống như máy ghi macro và sau đó là trình thực thi cho JEditorPane. Nhưng tôi cần kiểm soát nhiều hơn các sự kiện được tạo.

SO, giả sử tôi có một biên tập viên, tôi muốn:

  1. chụp tất cả các sự kiện gửi đến nó, và tại thời điểm đó, tôi có thể lưu trữ chúng trong danh sách, trên đĩa, hoặc whatver ..
  2. có thể sau đó chơi những sự kiện
  3. tình hình lý tưởng, là để cho phép người dùng chỉnh sửa một lệnh, trong đó có những câu như:
    "loại chìa khóa A, chọn dòng, xóa lựa chọn, con trỏ lên, dòng khởi động .. . "
+0

Câu hỏi của bạn không rõ ràng. –

Trả lời

3

Nếu bạn đang tìm kiếm các sự kiện GUI chuẩn, thì bạn muốn java.awt.Robot

Nếu bạn muốn xác định các sự kiện của riêng mình, bạn sẽ phải phân lớp các lớp GUI cần nhận các sự kiện đó (hoặc tốt hơn, tạo một bộ điều khiển bên ngoài cho chúng), xác định một lớp sự kiện và gửi các sự kiện. Bạn có thể sử dụng java.beans.EventHandler để gửi, tạo lớp xử lý của riêng bạn (tôi thấy hữu ích hơn trong các dịp), hoặc chèn các sự kiện của bạn (tùy thuộc vào cách chúng kế thừa) vào hàng đợi sự kiện hệ thống (không thể tìm lớp để làm điều đó ... Tôi nghĩ đó là Bộ công cụ).

Tuy nhiên, tôi sẽ không thực hiện việc này. Những gì bạn mô tả (một máy ghi vĩ mô) nên được thực hiện bằng cách sử dụng một bộ điều khiển tạo ra/được cho ăn một loạt các thông điệp hành động cụ thể cho ứng dụng (xem mẫu lệnh).

+0

Tôi thích mẹo lệnh của bạn. Nhưng không thể tìm thấy bất cứ điều gì về cách thực sự làm điều đó. – Ayman

+0

Nếu không biết chính xác những gì bạn muốn làm, thật khó để đưa ra lời khuyên cụ thể. Tuy nhiên, hãy xem xét rằng một JEditorPane sử dụng một javax.swing.text.Document để quản lý nội dung của nó và bạn có thể đính kèm một DocumentListener để nhận tất cả các thay đổi đối với tài liệu này. Nếu bạn lưu các sự kiện của người nghe đó trong Danh sách, thì bạn có thể phát lại danh sách đó bất kỳ lúc nào và áp dụng các thay đổi - hoặc hoàn tác chúng. – kdgregory

+0

Bây giờ ít nhất, tôi muốn một cách đơn giản nhưng có thể lập trình để ghi và phát lại macro trên Trình chỉnh sửa. Vấn đề với việc đính kèm Tài liệu là chuyển động của Caret sẽ không được gửi đến Tài liệu. Vì vậy, tôi sẽ cần phải hookup đến các sự kiện nhận được/xử lý bởi các thành phần GUI.Các hành động có vẻ rất phù hợp, tôi cần một cách để kết nối để xem các hành động được gửi (để ghi lại) và sau đó là cách tiêm các hành động đã ghi/xử lý trở lại thành phần. Cảm ơn rất nhiều. – Ayman

2

Tôi tin rằng bạn cần phải xây dựng một thể hiện của sự kiện và sau đó gọi

java.awt.EventQueue.dispatchEvent(event) 

Đặt nguồn của sự kiện để các thành phần mong muốn.

+1

EventQueue.dispatchEvent là một phương thức thể hiện được bảo vệ. Bạn sẽ phải nhận hàng đợi sự kiện hiện tại và đẩy một lớp con để sử dụng phương thức đó. –

+0

Làm thế nào về postEvent() thay thế? –

+0

Rất tiếc. Có, postEvent() trông giống như câu trả lời đúng. –

6

Điều hiển nhiên cần làm là lấy số EventQueue và đăng sự kiện lên đó. Điều đó sẽ chỉ thêm sự kiện vào hàng đợi sẽ được gửi đi lần lượt trên EDT.

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event); 

Ai đó đã tuyên bố hôm qua Opera và Safari tự làm việc của mình và không cho phép yêu cầu mã không đáng tin cậy.

Cách trực tiếp để thực hiện là gọi Component.dispatchEvent.

+0

Tôi đã truy tìm mã sử dụng 'Component.dispatchEvent' và nếu tôi không nhầm, điều này thực sự sẽ gọi trình lắng nghe trên chuỗi hiện tại? Phương thức 'postEvent' có tốt hơn vì nó sẽ gọi trình xử lý trên chuỗi EventQueue không? – Jeach

+0

Bạn nên làm khá nhiều thứ với các thành phần trên EDT. (AWT tuyên bố là tất cả các thread-an toàn, nhưng không phải là.) Và tất nhiên, như tôi đã đề cập, có điều khoản. –

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