2016-12-28 6 views
0

Я борюсь с ActionListener в Java в родительском классе, я попробовал кучу возможных решений, но не смог заставить его работать. Это здесь также не помогло: Java actionlistener actionPerformed in different classActionListener в родительском классе

Проблема заключается в следующем:

Class2 расширяет Class1, у меня есть кнопка в Class2. Как только кнопка в классе2 нажата, Class1 должен быть уведомлен через прослушиватель действий и выполнить событие.

Я изо всех сил стараюсь, чтобы Class1 знал, что произошло событие. Мне это показалось довольно простым, но я все же боюсь.

Ваша помощь будет очень искупительной, спасибо!

Родитель Класс

package test; 

//imports removed for better visibility 

public class ParentClass extends JPanel implements ActionListener{ 

JFrame frame; 

public void createParentGui() { 
    frame = new JFrame("Frame"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    final JPanel mainCard = new JPanel(new CardLayout(20, 20)); 
    ChildClass card1 = new ChildClass(); 
    mainCard.add(card1); 

    frame.add(mainCard, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible(true); 

} 

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    System.out.println("Button pressed, action!"); 

} 
} 

Детский класс

package test; 

//imports removed for better visibility 

public class ChildClass extends ParentClass { 

ActionListener listener = null; //this is probably not right, how to do 
//with a local variable when passing it to the parent class? 

public Child() { 
    createGui(); 
} 

private void createGui() { 

    final JButton b = new JButton("press me"); 
    b.addActionListener(listener); 
    add(b); 
} 
} 
+0

, если 'Class2' знает, что действие выполнено' Class1' должно также знать, так как 'Class2' является' Class1'. В порядке, чтобы мы могли помочь вам, вероятно, включить ваш код. – SomeJavaGuy

+1

. Я думаю, вам стоит немного почитать о java-основах. Как понимание того, что означает, что ** объект ** имеет класс 2. И затем: укажите код, пожалуйста; на данный момент нет никаких шансов, что мы сможем помочь с таким вводом. Таким образом: положите [mcve] .... – GhostCat

+0

Спасибо за ваши ответы. Я добавил пример кода, который показывает проблему. – Doncholio

ответ

0

ChildClass имеет все поля и методы, которые ParentClass делает (в дополнение к своим собственным уникальным полям и методам). Так работает наследование.

Итак, поскольку ParentClass является ActionListener, это означает, что ChildClass тоже. В частности, ChildClass имеет унаследованоpublic void actionPerformed(ActionEvent e) способ ParentClass.

Следовательно, смените b.addActionListener(listener); на b.addActionListener(this).(вы также можете удалить listener поле ChildClass)

Новый код будет проходить «этот» ChildClass объект b, который будет вызывать actionPerformed(ActionEvent e) всякий раз, когда кнопка нажата. И так как любой объект ChildClass имеет actionPerformed(ActionEvent e)ParentClass, это означает, что ParentClass#actionPerformed(ActionEvent) будет называться (как вы и предполагали).

+0

Спасибо Трэвис, что сработало! И спасибо также за подробное объяснение, он обновил мои классы наследования. – Doncholio

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