Я пытаюсь перерисовать простой массаж в панели, активируя ActionEvent.Как запустить ActionEvent из JPanel
У меня есть MessagePanel
, который простирается JPanel
, в котором я определил addActionListener
метод и метод processEvent
для обработки события:
import java.awt.Graphics;
import javax.swing.JPanel;
import java.util.*;
import java.awt.event.*;
public class MessagePanel extends JPanel {
private String message = new Date().toString();
ArrayList<ActionListener> actionListenerList;
public MessagePanel(String message) {
this.message = message;
}
public void setMessage(String message){
this.message = message;
}
public void addActionListener(ActionListener listener) {
if (actionListenerList == null) {
actionListenerList = new ArrayList<>(2);
}
if (!actionListenerList.contains(listener)) {
actionListenerList.add(listener);
}
}
public void removeActionListener(ActionListener listener) {
if (actionListenerList != null &&
actionListenerList.contains(listener)) {
actionListenerList.remove(listener);
}
}
public void processEvent(ActionEvent e) {
ArrayList<ActionListener> list;
synchronized(this) {
if (actionListenerList == null) {
return;
}
list = (ArrayList<ActionListener>)actionListenerList.clone();
}
for (int i = 0; i < list.size(); i++) {
ActionListener listener = (ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawString(message, 0, 0);
}
}
Вот мой тестовый класс:
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public TestMessaePanel extends JFrame {
MessagePanel messagePanel = new MessagePanel(new Date().toString());
public TestMessagePanel() {
add(messagePanel);
messagePanel.setCentered(true);
messagePanel.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
messagePanel.setMessage(new Date().toString());
}
});
}
public static void main(String[] args) {
JFrame frame = new TestMessagePanelWithActionEvent();
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Я пытаясь, чтобы панель перерисовывала текущее время с каждым щелчком панели (без использования каких-либо других наборов событий), но я не могу понять, какое событие должно срабатывать и вызвать мой метод processEvent
. Я даже не уверен, действительно ли мне нужен processEvent
, если я могу просто реализовать этот процесс в другом месте.
EDIT WITH TEXTBOOK PROBLEM (below)
(Включить MessagePanel огонь ActionEvent) Класс MessagePanel в листинге 15.7 является подклассом JPanel; он может запускать MouseEvent, KeyEvent и ComponentEvent, но не ActionEvent. Измените класс MessagePanelтак, чтобы он мог запустить ActionEvent, когда щелкнул экземпляр класса MessagePanel. Назовите новый класс MessagePanelWithActionEvent. Протестируйте его с помощью апплета Java, который отображает текущее время на панели сообщений всякий раз, когда отображается панель сообщений , как показано на рисунке 36.9.
Да.Я занимаюсь проблемой учебника (имея дело с реализацией слушателей событий). В этой проблеме четко указано, что JPanel использует события мыши, но не события. Поэтому он просит вас выполнить событие action в JPanel. –
@peeskillet: пожалуйста, отправьте фактическое задание дословно в своем вопросе. Надеюсь, это на английском. –
Я разместил проблему в нижней части сообщения –