6
A
回答
1
3
Java尚未內置對C#等代表和事件的支持。您需要自行實施Observer或Publish/Subscribe模式。
0
Java對事件處理沒有語言支持。但是有些課程可以提供幫助。你可以看看java.awt.Event
class; java.awt.event
和java.beans
包。第一個包是AWT和Swing GUI庫中事件處理的基礎。 java.beans
包包含支持Java Beans specification的東西,包括屬性更改事件和bean上下文事件。
通常,事件處理是根據觀測器實現或發佈/訂閱的模式(如由kgiannakakis提及)
15
有在Java中沒有一流事件。所有事件處理都是使用接口和偵聽器模式完成的。例如:
// Roughly analogous to .NET EventArgs
class ClickEvent extends EventObject {
public ClickEvent(Object source) {
super(source);
}
}
// Roughly analogous to .NET delegate
interface ClickListener extends EventListener {
void clicked(ClickEvent e);
}
class Button {
// Two methods and field roughly analogous to .NET event with explicit add and remove accessors
// Listener list is typically reused between several events
private EventListenerList listenerList = new EventListenerList();
void addClickListener(ClickListener l) {
clickListenerList.add(ClickListener.class, l)
}
void removeClickListener(ClickListener l) {
clickListenerList.remove(ClickListener.class, l)
}
// Roughly analogous to .net OnEvent protected virtual method pattern -
// call this method to raise the event
protected void fireClicked(ClickEvent e) {
ClickListener[] ls = listenerList.getListeners(ClickEvent.class);
for (ClickListener l : ls) {
l.clicked(e);
}
}
}
客戶代碼通常使用匿名內部類註冊處理程序:
Button b = new Button();
b.addClickListener(new ClickListener() {
public void clicked(ClickEvent e) {
// handle event
}
});
5
的Java缺乏內在的事件處理,但也有庫,幫助你做到這一點。查看javaEventing,http://code.google.com/p/javaeventing/ 它的工作原理與C#中的相似,您首先定義事件,然後註冊事件偵聽器。您使用EventManager.triggerEvent(.. someEvent)觸發事件。它允許您爲事件提供自定義條件和有效載荷。
鮑勃
2
如果你正在尋找一個.NET類型的委託時,我提出這個模板化的解決方案。 它的優點是不需要強制轉換,只要使用不同的事件類,偵聽器就可以實現多個「事件」。
import java.util.EventListener;
import java.util.EventObject;
// replaces the .net delegate
public interface GenericEventListener<EventArgsType extends EventObject>
extends EventListener {
public void eventFired(EventArgsType e);
}
//------------------------------------------------
import java.util.EventObject;
import java.util.Vector;
// replaces the .net Event keyword
public class GenericEventSource<EventArgsType extends EventObject> {
private Vector<GenericEventListener<EventArgsType>> listenerList =
new Vector<GenericEventListener<EventArgsType>>();
//TODO handle multi-threading lock issues
public void addListener(GenericEventListener<EventArgsType> listener) {
listenerList.add(listener);
}
//TODO handle multi-threading lock issues
public void raise(EventArgsType e) {
for (GenericEventListener<EventArgsType> listener : listenerList) {
listener.eventFired(e);
}
}
}
//------------------------------------------------
// like a .net class extending EventArgs
public class MyCustomEventArgs extends EventObject {
private int arg;
public MyCustomEventArgs(Object source, int arg) {
super(source);
this.arg = arg;
}
public int getArg() {
return arg;
}
}
//------------------------------------------------
// replaces the .net event handler function. Can be put in a nested class, Java style
// Listener can handle several event types if they have different EventArg classes
public class MyCustomListener implements GenericEventListener<MyCustomEventArgs> {
private Object source = null;
private int arg;
public void eventFired(MyCustomEventArgs e) {
source = e.getSource();
arg = e.getArg();
// continue handling event...
}
}
//------------------------------------------------
import GenericEventListener;
import GenericEventSource;
// this is the class that would like to throw events (e.g. MyButton)
public class MyCustomEventSource {
// This is like declaring a .net public Event field of a specific delegate type
GenericEventSource<MyCustomEventArgs> myEvent = new GenericEventSource<MyCustomEventArgs>();
public GenericEventSource<MyCustomEventArgs> getEvent() {
return myEvent;
}
}
//------------------------------------------------
// Examples of using the event
MyCustomListener myListener1 = new MyCustomListener();
MyCustomEventSource mySource = new MyCustomEventSource();
mySource.getEvent().addListener(myListener1);
mySource.getEvent().raise(new MyCustomEventArgs(mySource,5));
相關問題
- 1. 處理併發事件的Java Swing事件處理
- 2. Java中的事件處理
- 3. Java中的事件處理與C#中的事件處理
- 4. 處理引發LostFocus和停用事件
- 5. 如何處理由事件處理程序引發的域事件?
- 6. 處理單獨線程中的設備引發的事件
- 7. Java中的事件處理程序
- 8. Java中事件處理的缺陷
- 9. Java/Android中的事件處理
- 10. Java中的線程和事件處理
- 11. Windows事件處理Java
- 12. 鼠標事件處理Java
- 13. Java事件處理框架
- 14. java swing jtextfiled事件處理
- 15. 事件處理問題 - Java
- 16. Java - 事件處理設計
- 17. 我該如何處理New中引發的事件?
- 18. 在Java中處理事件:它是否需要空的事件處理程序
- 19. WPF - 如何處理引發該事件的組件外的鼠標事件?
- 20. 在Java中學習事件處理
- 21. 在派生類中引發事件處理程序
- 22. JavaScript中,事件處理程序始終調用,即使不引發事件
- 23. 在Python中處理Outlook發送事件
- 24. C#=未處理的ListView引發的事件。
- 25. 如何處理WindowsPhone8中的事件觸發事件?
- 26. 事件在Java中使用通用處理程序處理
- 27. 觸發事件處理器回發c#
- 28. nodemon引發未處理的錯誤事件
- 29. 處理後臺線程引發的事件
- 30. 的Java Swing:保持事件處理maintanable
你應該嘗試詳細闡述一下你在做什麼。什麼樣的事件? Java中沒有內在事件,也許異常是你所追求的? – falstro 2009-07-30 07:34:02
你的意思是AWT事件嗎? – 2009-07-30 07:34:34
像這樣 http://www.codeproject.com/KB/cs/csevents01.aspx – bdhar 2009-07-30 07:37:44