利用Java的事件驱动程序做的一些习题(一)

题目

**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里面即可。

发布了100 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43576028/article/details/101477206