java中如何在窗体上插入一个随鼠标动眼睛的小人

java中如何在窗体上插入一个随鼠标动眼睛的小人,第1张

我自己编了一个程序,有2个文件,我先说一下思路

用线程编程

监听鼠标移动事件,用线程不断获取鼠标坐标

根据鼠标坐标和眼球陵弊唯坐标来画出眼球的位置

package s0124随鼠标动眼睛

//最初编写出问题的原因是没有明白把要做的事情放到run方法里面

import java.awt.BorderLayout

import java.awt.Graphics

import 尺培java.awt.event.MouseEvent

import java.awt.event.MouseListener

import java.awt.event.MouseMotionListener

import javax.swing.ImageIcon

import javax.swing.JFrame

import javax.swing.JPanel

public class Main extends JFrame{

   static int xx

    static int yy

    JPanel drawpanel

    Graphics g

    

public static void main(String[] args) {

Main a=new Main()

}

    

public Main()

{

this.setTitle("随着鼠标动眼睛")

this.setSize(500,500)

this.setLocationRelativeTo(null)       //设置窗体出现位置居中  

    this.setDefaultCloseOperation(3)      //设置窗体的关闭 *** 作

    this.setResizable(false)                      //设置禁止调整窗体的大小                              

    this.setLayout(new BorderLayout())            //设置为边框布局

    drawpanel=new JPanel()                        //新建一个画图面板

    this.add(drawpanel,BorderLayout.CENTER)       //将画图面板添加到窗体的中间位置     

    this.setVisible(true)                        卜镇 //设置窗体可见

    g=drawpanel.getGraphics()                     //得到画图面板的画笔,为了传递给监听器listener

    

    MyThread mt=new MyThread(g,drawpanel)         //新建一个监听器,并把参数传递进去

    drawpanel.addMouseMotionListener(mt)          //为画图面板添加监听对象

    Thread r=new Thread(mt)                     

r.start()                                //启动线程

}

}

package s0124随鼠标动眼睛

import java.awt.Graphics

import java.awt.event.MouseEvent

import java.awt.event.MouseMotionListener

import javax.swing.JPanel

import javax.swing.plaf.SliderUI

public class MyThread implements Runnable,MouseMotionListener{

int x

int y

Graphics g

JPanel drawpanel

public MyThread(Graphics g,JPanel drawpanel)

{

this.g=g

this.drawpanel=drawpanel

}

public void run()

{    

while(true)

{

try {

Thread.sleep(10)

} catch (InterruptedException e) {

e.printStackTrace()

}

g.clearRect(0, 0, 600, 600)

g.drawOval(100, 100, 100, 100) 

g.drawOval(300, 100, 100, 100) 

//画左眼球

int x1=150+(x-150)/5

int y1=150+(y-150)/5

g.fillOval(x1-15,y1-15, 30,30)

//画右眼球

int x2=350+(x-350)/5

int y2=150+(y-150)/5

g.fillOval(x2-15,y2-15, 30,30)

g.drawLine(200, 300, 250, 250)

g.drawLine(250, 250,300,300)

g.drawLine(150, 350, 350, 350)

}

}

public void mouseDragged(MouseEvent e) {

}

public void mouseMoved(MouseEvent e) {

  x=e.getX()

  y=e.getY()

}

}

function newEyeballPos(currPos,eyePos) {

  return Math.min(Math.max(currPos,eyePos+3), eyePos+17) + "px"

}

以水平方向举例:

函数里currPos就是鼠标指针的水平位置clientX。这个改橘值有三种情况

A、小于eyePos+3

B、介于eyePos+3和eyePos+17之间

C、大于eyePos+17

A情况:返回eyePos+3

B情况核银团:返回currPos

C情况:返回eyePos+17

也就是说“眼珠子”在“眼睛”里活动的范围介于(等于)eyePos+3和eyePos+17之间,如图所示:

水平和垂直两个方向都是如此计搏枝算。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8220483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存