2013-03-06 2 views
0
public class event { 
    public static void main(String[] args) { 
     Sframe frame = new Sframe(); 
     frame.setSize(800,600); 
     frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
} 

class Sframe extends javax.swing.JFrame { 
    public Sframe() { 
     Spanel panel = new Spanel(); 
     getContentPane().add(panel); 
     panel.buttonadd(); 
     //panel.buttonadd(); 
    } 
} 

class Spanel extends javax.swing.JPanel { 

    public void buttonadd() { 
     javax.swing.JButton blackb = new JButton("Black"); 
     add(blackb); 
     blackb.addActionListener((ActionListener)EventHandler 
     .create(ActionListener.class,this,"hello")); 
    } 
    public void hello() { 
     System.out.println("I love every girl"); 
    } 
    static int i; 
} 

Когда я нажимаю на черную кнопку, это вызывает следующую ошибку. Я следую за Core Java-книгой.ActionListener, созданный с помощью EventHandler, не работает

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: No method called hello on class Spanel with no arguments 
at java.beans.EventHandler.invokeInternal(EventHandler.java:476) 
at java.beans.EventHandler.access$000(EventHandler.java:278) 

Я пропустил много строк в ошибке ... его длинный список.

ответ

1

Для этого необходимо, чтобы целевой класс был public. Отражение используется под капотом на EventHandler и имеет ограничение только на возможность использования классов public для поиска целевого метода.

public class Spanel { 
+0

Да, его работа ... но по какой-либо причине .. почему это требует, чтобы Spanel была общедоступной. –

+0

Это требование из-за использования отражения от «EventHandler». См. Обновление. – Reimeus

Смежные вопросы