'u izlemenizi öneririm Pratik sorun çözüldü (bkz. Mark Peters' ve jjnguy's cevapları). Ve olası eşzamanlılık sorunlarından kaçınmak için fireActionPerformed
yönteminden de bahsetmiştik (bkz. OscarRyz' answer).
Eklemek istediklerim, 'un tüm özel ve korumalı yöntemleri (fireActionPerformed
dahil) arayarak, herhangi bir sınıfın alt sınıfını yansıtma gerekmeden aramalarıdır. İlk olarak, yöntem, alt sınıflarından biri değil (yöntemiyle fireActionPerformed
için yani AbstractButton.class
beyan inci sınıfın Class
nesne olmaya method = clazz.getDeclaredMethod()
(clazz
ihtiyaçları olan özel veya korumalı yöntemin yansıması Method
nesneyi almak değilJButton.class
)). Ardından, özel veya korunan yöntemlere/alanlara erişmeye çalışırken ortaya çıkabilecek s'yi bastırmak için method.setAccessible(true)
numaralı telefonu arayın. Son olarak, method.invoke()
'u arayın.
Yansıma kullanmanın dezavantajlarını listeleyebilmek için yansıma hakkında yeterince bilgi sahibi değilim. Bununla birlikte, Reflection API trail'a göre mevcutturlar (bkz. "Yansımanın Gerilimleri"). Bunun iyi bir açıklama olsa da
// ButtonFireAction.java
import javax.swing.AbstractButton;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
public class ButtonFireAction
{
public static void main(String[] args) throws ReflectiveOperationException
{
JButton button = new JButton("action command");
Class<AbstractButton> abstractClass = AbstractButton.class;
Method fireMethod;
// signature: public ActionEvent(Object source, int id, String command)
ActionEvent myActionEvent = new ActionEvent(button,
ActionEvent.ACTION_PERFORMED,
button.getActionCommand());
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
}
});
// get the Method object of protected method fireActionPerformed
fireMethod = abstractClass.getDeclaredMethod("fireActionPerformed",
ActionEvent.class);
// set accessible, so that no IllegalAccessException is thrown when
// calling invoke()
fireMethod.setAccessible(true);
// signature: invoke(Object obj, Object... args)
fireMethod.invoke(button,myActionEvent);
}
}
Dikkat edilmesi gereken bir şey, ActionListeners'ın EDT'de çalıştırılmaya başlandığını varsaymasıdır, bu yüzden el ile gönderirseniz EDT'de de bunu yapmak istersiniz. –
Yorumumla ilgili olarak: ActionListener ürününüzün EDT'de çalıştırılacağını varsaymanız için * belgelendirilmiş * herhangi bir yer bilen var mı? –
* Burada * belgelenmiştir * http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html#event_dispatching * GUI görünür olduğunda, çoğu program düğme eylemleri gibi olaylar tarafından yürütülür ya da fare tıklaması, ** her zaman ** olay gönderen iş parçacığında işlenir * Oradan EDT'de çalıştıklarını varsayabiliriz. – OscarRyz