题目
**16.6 (两个消息交替出现)编写一个程序,当点击鼠标时,面板上交替显示两个消息“Java is fun”和“Java is powerful”。
效果
#代码
package Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Exercise16_6 extends JFrame {
public Exercise16_6(){
ChangeMessage cm=new ChangeMessage();
add(cm);
}
public static void main(String[] args) {
Exercise16_6 frame=new Exercise16_6();
frame.setTitle("交替显示信息");
frame.setSize(400,200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
static class ChangeMessage extends JPanel{
private String message1="java is fun";
private String message2="java is powerful";
private static int i=0;
public ChangeMessage(){
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
i++;
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponents(g);
if(i%2==0){
g.drawString(message1,getWidth()/2,getHeight()/2);
}
else{
g.drawString(message2,getWidth()/2,getHeight()/2);
}
}
}
}
思路解析
这里用到了鼠标监听器——addMouseListener
值得一提的是,因为监听器只关心鼠标的操作,所以采用的是匿名内部类监听器扩展MouseListener,而MouseListener是需要实现所有的处理器的,即使监听器并不关心其他时间,也必须重写所有处理器。
public ChangeMessage(){
addMouseListener(new MouseListener() {
//即使监听器并不关心其他时间,也必须重写所有处理器。
@Override
public void mouseClicked(MouseEvent e) {
i++;
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
MouseMotionListener接口和MouseListener接口所覆盖的方法
MouseMotionListener | MouseListener |
---|---|
鼠标拖动 | 鼠标按下 |
鼠标移动 | 鼠标释放 |
鼠标点击 | |
鼠标输入 | |
鼠标退出 |
因为题目里面要求的是鼠标点击,所以选择扩展MouseListener类
在鼠标点击方法——mouseClicked里面添加内容,每次点击使得静态变量i自增一次,然后调用repaint()方法。
repaint()方法会让JVM调用paintComponent方法
paintComponent方法的实现
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(i%2==0){
g.drawString(message1,getWidth()/2,getHeight()/2);
}
else{
g.drawString(message2,getWidth()/2,getHeight()/2);
}
}
因为paintComponent方法写在内部类里面,所以是共享私有成员变量的,每次点击,i自增,paintComponent方法利用取余的方式,自动切换所绘制的字符串。
因为希望在屏幕上绘制字符串,所以内部类继承了JPanel
static class ChangeMessage extends JPanel{}.....
完成以上工作后,在主类里面对这个内部类进行实例化,增加到frame里面即可。