2013-10-06 1 views
1

Я пытаюсь перерисовать простой массаж в панели, активируя 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.

ответ

2

Я пытаюсь иметь панель перекрашивать текущее время с каждым нажатием на панели (без использования каких-либо других наборов событий)

ActionListener должны быть использован только для событий, которые должны чтобы вызвать его, например, таймер или абстрактную кнопку. Вместо этого вы должны использовать MouseListener для компонентов, которые реагируют на события мыши.


Редактировать Ваше задание:

Класс MessagePanel в листинге 15.7 является подклассом JPanel; он может запускать MouseEvent, KeyEvent и ComponentEvent, но не ActionEvent. Измените класс MessagePanel, чтобы он мог запустить ActionEvent, когда щелкнул экземпляр класса MessagePanel. Назовите новый класс MessagePanelWithActionEvent. Протестируйте его с помощью апплета Java, который отображает текущее время на панели сообщений всякий раз, когда нажимается панель сообщений, как показано на рисунке 36.9.

  • Вы будете иметь, чтобы дать вашему MessagePanel в MouseListener, тот, который на mousePressed вызывает ваш ActionListener (ы).
  • В этом MouseListener вам нужно будет создать объект ActionEvent. Поскольку это назначение, я не собираюсь показывать вам, как это сделать, но вместо этого предложит вам перейти к API ActionEvent, чтобы узнать, что нужно для этого объекта, и дать ему попробовать.
  • Затем вам нужно будет позвонить actionPerformed(...) с объектом ActionEvent, который вы только что создали, на любом ActionListeners, который необходимо вызвать.
+0

Да.Я занимаюсь проблемой учебника (имея дело с реализацией слушателей событий). В этой проблеме четко указано, что JPanel использует события мыши, но не события. Поэтому он просит вас выполнить событие action в JPanel. –

+0

@peeskillet: пожалуйста, отправьте фактическое задание дословно в своем вопросе. Надеюсь, это на английском. –

+0

Я разместил проблему в нижней части сообщения –

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

  • Нет связанных вопросов^_^