2013-10-01 7 views
-2

Похоже, я полностью не понимаю, как это работает ..... У меня есть класс, который расширяет JPanel и реализует Actionlistener, а затем я хочу добавить это к классу, который расширяет JFrame. ... Я не могу получить эту работу .....Невозможно добавить actionlistener из другого класса

public class testPanel extends JFrame implements ActionListener{ 
JButton someBtn; 

public testPanel(JButton someBtn){ 
    this.someBtn = someBtn; 
    add(someBtn); 
    someBtn.addActionListener(this); 

} 

@Override 
public void actionPerformed(ActionEvent e){ 
    if(e.getSource() == someBtn) 
     System.out.println("this worked"); 
} 

} 

второй файл класса

public class JavaApplication3 extends JFrame{ 

/** 
* @param args the command line arguments 
*/ 
JButton button; 

public JavaApplication3(){ 
    super("blah"); 
    JFrame p = new testPanel(button); 
    add(p); 
    pack(); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public static void main(String[] args) { 
    // TODO code application logic here 
    new JavaApplication3(); 
} 
} 
+0

Вы не инициализируетесь переменной экземпляра кнопки ... – ppeterka

+0

Обычно вы хотите включить фактические ошибки вы получите. –

+0

Ваш пример не может работать, оба класса простираются от JFrame – MadProgrammer

ответ

1

Эта линия в testPanel должны, конечно, бросить исключение:

add(someBtn); 

Как ссылка someBtn пуста ...

Вы никогда не инициализируется переменная button экземпляра в классе JavaApplication3, bzut использовали переменную в конструкторе testPanel класса.

Однако вы хотели бы получить обратные этот поток:

  1. создать кнопку внутри testPanel класса
  2. , если вы хотите, чтобы получить ссылку из JavaApplication3 класса - вы «л нужно геттер в классе testPanel

Пример:

public class testPanel extends JFrame implements ActionListener{ 
    JButton someBtn; //consider using private 

    public testPanel(){ 
     this.someBtn = new JButton(); //add correct constructor here 
     add(someBtn); 
     someBtn.addActionListener(this); 
    } 

    public JButton getSomeBtn() { 
     reeturn someBtn; 
    } 
//... rest comes here 
} 



public class JavaApplication3 extends JFrame{ 

    JButton button; 

    public JavaApplication3(){ 
     super("blah"); 
     JFrame p = new testPanel(); 
     button = p.getSomeBtn(); //this is the important line 
     add(p); 
     pack(); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    //... rest comes here  
} 

Sidenote: использовать Java именование: Класс имена начинаются с Столицей ...

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