书上的一道习题,让我给MessagePanel(继承JPanel,用来显示字符串)添加ActionEvent支持,要实现的效果是鼠标点击后,在MessagePanel上显示当前时间我如下实现,但发现没效果,求指点。
class MessagePanelWithActionEvent extends JPanel implements ActionListener
{
// data field
private int xOfMessage = 20; //message的x坐标
private int yOfMessage = 20; //message的y坐标
private boolean setCenter = false; //是否要将message设在中央的标志
private String message; //显示的字符串信息
private int interval = 20; //移动的间隔
//method field
public MessagePanelWithActionEvent()
{
this.message = "Welcome to java !";
}
public MessagePanelWithActionEvent(String message)
{
this.message = message;
}
public int getXOfMessage()
{
return xOfMessage;
}
public int getYOfMessage()
{
return yOfMessage;
}
public String getMessage()
{
return message;
}
public int getInterval()
{
return interval;
}
public void setXOfMessage(int xOfMessage)
{
this.xOfMessage = xOfMessage;
repaint();
}
public void setYOfMessage(int yOfMessage)
{
this.yOfMessage = yOfMessage;
repaint();
}
public void setMessage(String message)
{
this.message = message;
repaint();
}
public void setInterval(int interval)
{
this.interval = interval;
}
public void setMessageCenter()
{
setCenter = true;
repaint();
}
public void upMessage()
{
yOfMessage -= interval;
setCenter = false;
repaint(); //重画图像,在Component中定义
}
public void downMessage()
{
yOfMessage += interval;
setCenter = false;
repaint();
}
public void leftMessage()
{
xOfMessage -= interval;
setCenter = false;
repaint();
}
public void rightMessage()
{
xOfMessage += interval;
setCenter = false;
repaint();
}
protected void processMouseEvent(MouseEvent event) //重写processMouseEvent方法
{
if(event.getID() == MouseEvent.MOUSE_CLICKED)
{
processActionEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,null));
}
}
private void processActionEvent(ActionEvent event)
{
actionPerformed(event);
}
public void actionPerformed(ActionEvent event)
{
setMessage( new GregorianCalendar().getTime().toString() );
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if(setCenter == true)
{
FontMetrics fontMetric = g.getFontMetrics();
int MessageWidth = fontMetric.stringWidth(message);
int MessageAscent = fontMetric.getAscent();
xOfMessage = getWidth() / 2 - MessageWidth / 2;
yOfMessage = getHeight() / 2 + MessageAscent / 2;
}
g.drawString(message,xOfMessage,yOfMessage);
}
}public class TestMessagePanelWithActionEvent extends JFrame
{
public static void main(String[] args)
{
TestMessagePanelWithActionEvent frame = new TestMessagePanelWithActionEvent();
frame.add(new MessagePanelWithActionEvent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package view;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
/**
*
* @author Administrator
*/
class MessagePanelWithActionEvent extends JPanel implements ActionListener,MouseListener
{
// data field
private int xOfMessage = 20; //message的x坐标
private int yOfMessage = 20; //message的y坐标
private boolean setCenter = false; //是否要将message设在中央的标志
private String message; //显示的字符串信息
private int interval = 20; //移动的间隔
//method field
public MessagePanelWithActionEvent()
{
this.message = "Welcome to java !";
this.addMouseListener(this);
}
public MessagePanelWithActionEvent(String message)
{
this.message = message;
this.addMouseListener(this);
}
public int getXOfMessage()
{
return xOfMessage;
}
public int getYOfMessage()
{
return yOfMessage;
}
public String getMessage()
{
return message;
}
public int getInterval()
{
return interval;
}
public void setXOfMessage(int xOfMessage)
{
this.xOfMessage = xOfMessage;
repaint();
}
public void setYOfMessage(int yOfMessage)
{
this.yOfMessage = yOfMessage;
repaint();
}
public void setMessage(String message)
{
this.message = message;
repaint();
}
public void setInterval(int interval)
{
this.interval = interval;
}
public void setMessageCenter()
{
setCenter = true;
repaint();
}
public void upMessage()
{
yOfMessage -= interval;
setCenter = false;
repaint(); //重画图像,在Component中定义
}
public void downMessage()
{
yOfMessage += interval;
setCenter = false;
repaint();
}
public void leftMessage()
{
xOfMessage -= interval;
setCenter = false;
repaint();
}
public void rightMessage()
{
xOfMessage += interval;
setCenter = false;
repaint();
}
protected void processMouseEvent(MouseEvent event) //重写processMouseEvent方法
{
if(event.getID() == MouseEvent.MOUSE_CLICKED)
{
processActionEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,null));
}
}
private void processActionEvent(ActionEvent event)
{
actionPerformed(event);
}
public void actionPerformed(ActionEvent event)
{
setMessage( new GregorianCalendar().getTime().toString() );
}
public void mouseClicked(MouseEvent e){
System.out.println("-----mouseClicked---------");
} /**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e){} /**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e){} /**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e){} /**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e){}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if(setCenter == true)
{
FontMetrics fontMetric = g.getFontMetrics();
int MessageWidth = fontMetric.stringWidth(message);
int MessageAscent = fontMetric.getAscent();
xOfMessage = getWidth() / 2 - MessageWidth / 2;
yOfMessage = getHeight() / 2 + MessageAscent / 2;
}
g.drawString(message,xOfMessage,yOfMessage);
}
}public class TestMessagePanelWithActionEvent extends JFrame
{
public static void main(String[] args)
{
TestMessagePanelWithActionEvent frame = new TestMessagePanelWithActionEvent();
frame.add(new MessagePanelWithActionEvent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
额,是这样的,忘了MouseListener,光顾着ActionListener了,谢谢了