Привет, когда я следил за учебником, я узнал способ инициировать ответ в основном классе одним нажатием кнопки в другом классе.запуск действия кнопки из другого класса в основном методе
Так что я сделал то, что у меня есть класс 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);
}
Когда вы регистрируете «ActionListener» для компонента, он получает имя _every time_, а «ActionEvent» встречается на компоненте, это нормальное поведение. – Berger
да, но почему toolbar.setStringListener в основном методе также вызывается каждый раз, когда вызывается действие прослушивателя? @Berger – forJ
Не могли бы вы разместить свой основной класс? Кроме того, что заставляет вас думать, что 'toolbar.setStringListener' вызывается каждый раз? – Berger