2013-10-06 2 views
1

ActionEvent를 발생시켜 패널에서 간단한 마사지를 다시 채색하려고합니다.JPanel에서 ActionEvent를 발생시키는 방법

내가 가지고 내가 addActionListener 방법과 이벤트 처리하는 processEvent 방법을 정의하는 JPanel 확장하는 MessagePanel : 난

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); 
    } 
} 

:

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); 
    } 
} 

여기 내 테스트 클래스의를 패널을 클릭 할 때마다 (다른 이벤트 세트를 사용하지 않고) 패널을 다시 칠하도록하려하지만 어떤 이벤트가 발생했는지 파악할 수 없어 내 processEvent 메서드를 호출합니다. 심지어 내가 다른 곳에서 프로세스를 구현할 수 있다면 심지어 내가 processEvent을 필요로하는지 잘 모르겠다.

EDIT WITH TEXTBOOK PROBLEM (below) 

목록 15.7에서 MessagePanel 클래스 (ActionEvent를 해고 MessagePanel를 사용하는) 인 JPanel의 하위 클래스; MouseEvent, KeyEvent, 및 ComponentEvent를 방아쇠 할 수 있습니다 만, ActionEvent는 방아쇠 할 수 없습니다. MessagePanel 클래스의 인스턴스를 클릭하면 ActionEvent를 발생시킬 수 있도록 MessagePanel 클래스를 수정하십시오. 새 클래스의 이름을 MessagePanelWithActionEvent로 지정합니다. 그림 36.9와 같이 메시지 패널이 클릭 될 때마다 메시지 패널에 을 표시하는 Java 애플릿으로 테스트하십시오.

답변

2

내가 패널은 가정되는 이벤트에 대한

하는 ActionListener를 사용하는 것입니다 (다른 이벤트 세트를 사용하지 않고) 패널의 모든 클릭으로 현재 시간을 다시 칠해야하기 위해 노력하고있어 Timer 또는 AbstractButton과 같이 트리거합니다. 대신 마우스 이벤트에 응답하는 구성 요소에 MouseListener를 사용해야합니다.


편집 과제 :

목록 15.7의 MessagePanel 클래스는 JPanel의의 서브 클래스입니다; MouseEvent, KeyEvent, 및 ComponentEvent를 트리거 할 수 있습니다 만, ActionEvent는 트리거 할 수 없습니다. MessagePanel 클래스의 인스턴스가 클릭 될 때 ActionEvent를 발생시킬 수 있도록 MessagePanel 클래스를 수정하십시오. 새 클래스의 이름을 MessagePanelWithActionEvent로 지정합니다. 그림 36.9와 같이 메시지 패널이 클릭 될 때마다 메시지 패널에 현재 시간을 표시하는 Java 애플릿으로 테스트하십시오.

  • 당신은 당신의 MessagePanel에게의 mousePressed에 ActionListener를 (들)을 호출하는 MouseListener를, 하나를 포기해야 할 것입니다.
  • 이 MouseListener에서는, ActionEvent 객체를 생성 할 필요가 있습니다. 이것이 과제이므로, 어떻게 처리하는지 보여주지는 않지만 ActionEvent API를 사용하여이 객체가 필요로하는 것을 확인하고 시도해 보도록 제안합니다.
  • 그러면 호출해야 할 ActionListeners에 방금 만든 ActionEvent 객체로 actionPerformed(...)을 호출해야합니다.
+0

예.나는 교과서 문제 (리스너와 이벤트 구현하기)를 다룬다. 이 문제는 JPanel이 마우스 이벤트를 사용하지만 액션 이벤트는 사용하지 않는다는 것을 명확하게 명시합니다. 그래서 액션 이벤트를 JPanel에 구현하도록 요청합니다. –

+0

@peeskillet : 질문에 실제 할당을 그대로 게시하십시오. 잘하면 영어로되어 있습니다. –

+0

내 게시물 하단에 문제를 게시했습니다 –

관련 문제