#### 说明

canvas-nest.js 源码

http://www.bubuko.com/infodetail-2237716.html

地址:https://gitee.com/dgwcode/MyJavaCode/tree/master/Canvas-nest-swing

实现过程

1. 绘制一个容器
2. 用随机数生成坐标,绘制100个点
3. 用随机数生成每个点的运动方向,每次x轴位移多少,y轴位移多少
4. 每1/60秒用for循环重新计算点的坐标,重绘画布
5. 两个for循环嵌套,判断每个点与其他点的距离,若小于90px,则绘制连线,且连线的rgba透明度根据距离而变化6.添加鼠标吸附事件,鼠标进入画布后实时监听其位置,并在上述for循环中判断与鼠标的距离,设点为r,距离为dist,若dist>70且dist<140,rx-=0.03xdist,r.y-=0.03y_dist,即可实现吸附效果(前半段为加速,后半段为吸附)

Code

package main.canvas;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JFrame;
import javax.swing.JPanel; import java.awt.BorderLayout;
import java.awt.Color; public class MainFrame extends JFrame { private static final long serialVersionUID = -8808883923263763897L;
private static volatile MainFrame instance; public MainFrame() { this.setTitle("Canvas Nest");
this.setSize(new Dimension(660, 470));
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
this.setMinimumSize(new Dimension(400, 300));
this.setResizable(true);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); /**
* 100个点位置与方向的初始化
*/
R[] r = new R[100];
M mousePoint = new M();//监听鼠标位置
for (int i = 0; i < r.length; i++) {
r[i] = new R();
r[i].x = (float) (Math.random() * 660);
r[i].y = (float) (Math.random() * 470);
r[i].xa = (float) (2 * Math.random() - 1);//方向
r[i].ya = (float) (2 * Math.random() - 1);//方向
} JPanel panel = new JPanel() {
private static final long serialVersionUID = -7507627235240618009L; @Override
public void paint(Graphics g1) {
Graphics2D g_point = (Graphics2D) g1;//点
Graphics2D g_line = (Graphics2D) g1;//线
g_point.setColor(Color.blue);
// 通过键值设置渲染的抗锯齿
g_line.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g_point.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paint(g_point);
super.paint(g_line); for (int i = 0; i < r.length; i++) {
for (int j = 0; j < r.length; j++) {
// 画点 实际上可用filloval实现
g_point.drawLine((int) r[i].x, (int) r[i].y, (int) r[i].x, (int) r[i].y);
if (r[i] != r[j]) {
// 得到两个不同点的坐标 构成算出第三条边的长度dist
float x_dist = r[i].x - r[j].x;
float y_dist = r[i].y - r[j].y;
float dist = (float) (x_dist * x_dist + y_dist * y_dist);
// 根据距离算出透明度
float a = 0;
if (dist > 0 && dist < 8100) {
a = (1 - (dist / 8100)) * 100;
g_line.setColor(new Color(0, 100, 150, (int) a));
g_line.drawLine((int) r[i].x, (int) r[i].y, (int) r[j].x, (int) r[j].y);
}
}
}
}
}
};
panel.setBackground(Color.WHITE);
getContentPane().add(panel, BorderLayout.CENTER); /**
* 鼠标事件处理代码
*/
panel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
mousePoint.x = (float) e.getX();
mousePoint.y = (float) e.getY();
}
}); panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
mousePoint.x = null;
mousePoint.y = null;
}
}); new Thread(new Runnable() { @Override
public void run() {
while (true) {
try {
for (int i = 0; i < r.length; i++) {
// 仅仅加上方向值
r[i].x += r[i].xa;
r[i].y += r[i].ya;
/**
* 当前随机点如果在可视view中 那么
*/
r[i].xa *= r[i].x > 660 || r[i].x < 0 ? -1 : 1;
r[i].ya *= r[i].y > 470 || r[i].y < 0 ? -1 : 1;
// 在窗口的可视大小环境中
if (mousePoint.x != null && mousePoint.y != null) {
float x_dist = r[i].x - mousePoint.x;
float y_dist = r[i].y - mousePoint.y;
float dist = (float) (x_dist * x_dist + y_dist * y_dist);
if (dist > 4900 && dist < 19600) {
r[i].x -= 0.03 * x_dist;
r[i].y -= 0.03 * y_dist;
}
}
}
/**
* 4.每1/60秒用for循环重新计算点的坐标,重绘画布
* 5.两个for循环嵌套,判断每个点与其他点的距离,
* 若小于90px,则绘制连线,且连线的rgba透明度根据距离而变化
*/
panel.repaint();
Thread.sleep(1000 / 60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); } public static MainFrame getIstance() {
if (instance == null) {
synchronized (MainFrame.class) {
if (instance == null) {
instance = new MainFrame();
}
}
}
return instance;
} private class R { float x;
float y;
float xa;
float ya; } private class M {
Float x;
Float y;
} }

Swing实现canvas-nest.js 源码的更多相关文章

  1. 深入理解unslider.js源码

    最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...

  2. underscore.js 源码

    underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...

  3. MVVM大比拼之avalon.js源码精析

    简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...

  4. Jquery.cookie.js 源码和使用方法

    jquery.cookie.js源码和使用方法 jQuery操作cookie的插件,大概的使用方法如下 $.cookie(‘the_cookie’); //读取Cookie值$.cookie(’the ...

  5. MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法

    返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...

  6. basket.js 源码分析

    basket.js 源码分析 一.前言 basket.js 可以用来加载js脚本并且保存到 LocalStorage 上,使我们可以更加精准地控制缓存,即使是在 http 缓存过期之后也可以使用.因此 ...

  7. java实现 swing模仿金山打字 案例源码

    java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http://java.662p.com 代码: <font size="3">im ...

  8. 国籍控件(js源码)

    国籍控件(js源码) 一直苦于没有好的国籍控件可以用,于是抽空写了一个国籍控件,现分享给大家. 主要功能和界面介绍 国籍控件主要支持中文.英文过滤以及键盘上下事件. 源码介绍 国籍控件核心是两个文件, ...

  9. vue.js源码精析

    MVVM大比拼之vue.js源码精析 VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多 ...

随机推荐

  1. bzoj1014火星人

    ...强迫症终于A了这道题  bzoj前30道全A指日可待 splay维护这个结点控制的字符串的hash值 每次旋转重新算一遍就可以了 查询的时候跑一个二分 讲起来很简单但是还是调了1h才调对了spl ...

  2. android SDK manager 无法获取更新版本列表【转载】

    http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息:  http://developer.android.c ...

  3. ACM学习历程—HDU4746 Mophues(莫比乌斯)

    Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of some ...

  4. HDOJ1024(最大M子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. 文件异步上传,多文件上传插件uploadify

    本文中使用java作为例子 uploadify下载 http://files.cnblogs.com/chyg/uploadify.zip jsp页面中需要引入: <script type=&q ...

  6. springMVC绑定json参数之二(2.2.4)

    二.springmvc 接收不同格式的json字符串 4).格式四:json传递复杂对象(对象中有属性,还有List,这里验证数组接收,不用List,其他的和上一节不变) 测试一: Test对象属性如 ...

  7. 可定制的分词库——Yaha(哑哈)分词

    可定制的分词库——Yaha(哑哈)分词在线测试地址:http://yaha.v-find.com/ 部署于GAE yahademo.appspot.comYaha分词主要特点是把分词过程分成了4个阶段 ...

  8. 关于android的一些博文收集

    Java网络编程总结 http://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html Android应用系列:双击返回键退出程序 http:// ...

  9. SSM框架集成Redis

    SSM-Spring+SpringMVC+Mybatis框架相信大家都很熟悉了,但是有的时候需要频繁访问数据库中不变或者不经常改变的数据,就会加重数据库的负担,这时我们就会想起Redis Redis是 ...

  10. Hadoop 1.2.1 MapReduce 例子

    自学hadoop真的很困难,主要是hadoop版本太混乱了,各个版本之间兼容性并不算太好.更主要的是网上的很多MapReduce的Java例子不写import!!!只写类名!!!偏偏Hadoop中有很 ...