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 애플릿으로 테스트하십시오.
예.나는 교과서 문제 (리스너와 이벤트 구현하기)를 다룬다. 이 문제는 JPanel이 마우스 이벤트를 사용하지만 액션 이벤트는 사용하지 않는다는 것을 명확하게 명시합니다. 그래서 액션 이벤트를 JPanel에 구현하도록 요청합니다. –
@peeskillet : 질문에 실제 할당을 그대로 게시하십시오. 잘하면 영어로되어 있습니다. –
내 게시물 하단에 문제를 게시했습니다 –