2013-10-06 32 views
1

我試圖通過觸發一個ActionEvent在面板中重新繪製一個簡單的按摩。如何從JPanel中觸發一個ActionEvent

我有一個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) 清單15.7中的MessagePanel類是JPanel的一個子類;它可以觸發MouseEvent,KeyEvent和ComponentEvent,但不觸發ActionEvent。修改MessagePanel類,以便在單擊MessagePanel類的實例 時觸發ActionEvent。命名新類 MessagePanelWithActionEvent。使用Java applet測試它,只要消息面板被點擊了 ,就會在消息面板中顯示當前時間 ,如圖36.9所示。

回答

2

我想有面板重繪當前時間與面板的每次點擊(不使用其他任何事件集)

一個ActionListener是僅用於那些應該事件來觸發它,例如Timer或AbstractButton。您應該使用MouseListener來響應鼠標事件。


編輯你的任務:

清單15.7中的MessagePanel類是JPanel的一個子類;它可以觸發一個MouseEvent,KeyEvent和ComponentEvent,但不是一個ActionEvent。修改MessagePanel類,以便在單擊MessagePanel類的實例時觸發一個ActionEvent。命名新的類MessagePanelWithActionEvent。使用Java applet進行測試,無論何時單擊消息面板,它都會在消息面板中顯示當前時間,如圖36.9所示。

  • 你將必須給你一個MessagePanel的MouseListener,一個在調用的mousePressed你的ActionListener(S)。
  • 在這個MouseListener中,你將不得不創建一個ActionEvent對象。既然這是一項任務,我不會告訴你如何做到這一點,而是建議你去ActionEvent API看看這個對象需要什麼,然後試試看。
  • 然後,您必須使用剛剛在任何需要調用的ActionListener上創建的ActionEvent對象調用actionPerformed(...)
+0

是的。我正在做一個教科書問題(處理實現監聽器的事件)。問題清楚地表明,JPanel使用鼠標事件而不是行爲事件。因此它會要求您將操作事件實施到JPanel中。 –

+0

@peeskillet:請在你的問題中逐字地發佈實際的作業。希望這是英文。 –

+0

我在帖子的底部發布了問題 –

相關問題