2016-02-23 4 views
0

Привет, когда я следил за учебником, я узнал способ инициировать ответ в основном классе одним нажатием кнопки в другом классе.запуск действия кнопки из другого класса в основном методе

Так что я сделал то, что у меня есть класс ToolBar с некоторым кодом ниже

private JButton helloButton; 
private JButton goodbyeButton; 

private StringListener textListener; 

public Toolbar() { 
    setBorder(BorderFactory.createEtchedBorder()); 

    helloButton = new JButton("Hello"); 
    goodbyeButton = new JButton("Goodbye"); 

    helloButton.addActionListener(this); 
    goodbyeButton.addActionListener(this); 

    setLayout(new FlowLayout(FlowLayout.LEFT)); 

    add(helloButton); 
    add(goodbyeButton); 

} 

public void setStringListener(StringListener listener) { 
    this.textListener = listener; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    JButton clicked = (JButton) e.getSource(); 

    if (clicked == helloButton) { 
     if (textListener != null){ 
      textListener.textEmitted("Hello\n"); 
     } 
     //textPanel.appendText("Hello\n"); 
    } else { 
     if (textListener != null){ 
      textListener.textEmitted("Goodbye\n"); 
     //textPanel.appendText("Goodbye\n"); 
    } 
} 
} 

Тогда в StrinListener интерфейсе У меня есть

public interface StringListener { 

public void textEmitted (String text); 

} 

Наконец, в основном я получаю два вместе

 toolbar.setStringListener(new StringListener(){ 

     @Override 
     public void textEmitted(String text) { 
      textPanel.appendText(text); 

     } 

    }); 

Что мне интересно, так это то, что нажимает кнопку триггера respo nse в основном методе «каждый раз» я нажимаю?

так что клик передается в текстовый метод в интерфейсе StringListener и получен методом toolbar.setStringListener в основном методе. Но что это заставляет его работать снова и снова, когда я нажимаю кнопку?

не следует считывать код только один раз, если не существует цикла или какого-либо другого цикла?

Благодаря

мой основной класс

public MainFrame() { 
    super("Hello World"); 

    setLayout(new BorderLayout()); 

    textPanel = new TextPanel(); 
    btn = new JButton("Click Me!"); 
    toolbar = new Toolbar(); 
    formPanel = new FormPanel(); 

    toolbar.setStringListener(new StringListener(){ 

     @Override 
     public void textEmitted(String text) { 
      textPanel.appendText(text); 

     } 

    }); 

    formPanel.setFormListener(new FormListener(){ 
     public void formEventOccurred(FormEvent e){ 
      String name = e.getName(); 
      String occupation = e.getOccupation(); 

      textPanel.appendText(name + ": " + occupation + "\n"); 
     } 
    }); 

    add(toolbar, BorderLayout.NORTH); 
    add(textPanel, BorderLayout.CENTER); 
    add(formPanel, BorderLayout.WEST); 

    setSize(600, 500); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 

} 
+0

Когда вы регистрируете «ActionListener» для компонента, он получает имя _every time_, а «ActionEvent» встречается на компоненте, это нормальное поведение. – Berger

+0

да, но почему toolbar.setStringListener в основном методе также вызывается каждый раз, когда вызывается действие прослушивателя? @Berger – forJ

+0

Не могли бы вы разместить свой основной класс? Кроме того, что заставляет вас думать, что 'toolbar.setStringListener' вызывается каждый раз? – Berger

ответ

1

Он ведет себя так, как ожидается.

Помните, что когда вы устанавливаете textListener, класс панели инструментов удерживается на переменной экземпляра (textListener), и поэтому он сохраняется в памяти до тех пор, пока ваша программа запущена или пока объект панели инструментов не будет уничтожен. Просто потому, что это анонимный внутренний класс, не означает, что объект уничтожается после того, как метод textEmitted запускается один раз.

+0

, поэтому триггер actionListener запускает textListener.textEmitted («Hello»), но где этот метод вызывается? – forJ

+1

Вы устанавливаете textListener в своем основном классе, который сохраняется как переменная в вашем объекте панели инструментов. Каждый раз, когда вы нажимаете на одну из ваших кнопок, вызывается метод actionPerformed (ActionEvent e), и поскольку textListener не является нулевым (помните, что вы устанавливаете его в своем основном классе), вызывается метод textEmitted для textListener. Это то, что вы спрашиваете? – timsuldat

+0

Итак, textEmitted («Hello») в классе панели инструментов устанавливает каждый другой класс, который вызывает этот интерфейс, чтобы иметь textEmitted («Hello») вместо textEmitted(), что есть у меня в самом интерфейсе? – forJ

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