Swing实现canvas-nest.js 源码
#### 说明
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 源码的更多相关文章
- 深入理解unslider.js源码
最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...
- underscore.js 源码
underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...
- MVVM大比拼之avalon.js源码精析
简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...
- Jquery.cookie.js 源码和使用方法
jquery.cookie.js源码和使用方法 jQuery操作cookie的插件,大概的使用方法如下 $.cookie(‘the_cookie’); //读取Cookie值$.cookie(’the ...
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...
- basket.js 源码分析
basket.js 源码分析 一.前言 basket.js 可以用来加载js脚本并且保存到 LocalStorage 上,使我们可以更加精准地控制缓存,即使是在 http 缓存过期之后也可以使用.因此 ...
- java实现 swing模仿金山打字 案例源码
java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http://java.662p.com 代码: <font size="3">im ...
- 国籍控件(js源码)
国籍控件(js源码) 一直苦于没有好的国籍控件可以用,于是抽空写了一个国籍控件,现分享给大家. 主要功能和界面介绍 国籍控件主要支持中文.英文过滤以及键盘上下事件. 源码介绍 国籍控件核心是两个文件, ...
- vue.js源码精析
MVVM大比拼之vue.js源码精析 VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多 ...
随机推荐
- 8th
2017-2018-2 20179212<网络攻防实践>第8周作业 视频学习 Kali权限维持之后门 权限维持包含Tunnel工具集.Web后门.系统后门三个子类.其中系统后门与web后门 ...
- 使用 Python 发送短信?
上回食行生鲜签到,我们说到怎么把签到结果发出来,于是就找到了 Twilio. Twilio 是一个位于加利福尼亚的云通信(PaaS)公司,致力于为开发者提供通讯模块的 API.由于 Twilio 为试 ...
- 数据结构-二叉搜索树的js实现
一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度 ...
- Code:template
ylbtech-Code: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech.cn ...
- JavaScript-Tool-富文本:UEditor
ylbtech-JavaScript-Tool-富文本:UEditor UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点.开源基于BSD协 ...
- Arcane Numbers 1
Vance and Shackler like playing games. One day, they are playing a game called "arcane numbers& ...
- 项目:条件查询 通过StringBulider和ArrayList(参数有序) 手动拼接sql
条件查询的sql拼接 参数拼接 public List<Product> findAll(Product product) throws SQLException { //1.1 拼凑sq ...
- 7、linux常见系统环境变量
使用env命令显示所有环境变量 env (常见的有HOSTNAME,SHELL,HISTSIZE,PERL5LIB,USER,PATH,PWD,LANG,HOME, LD_LIBRARY_PATH ...
- jdk 安装及环境变量配置
一.jdk安装及基础配置,转自文章来源:http://www.cnblogs.com/smyhvae/p/3788534.html 1.jdk下载及安装 下载网站:http://www.oracle. ...
- 8、泛型程序设计与c++标准模板库3.迭代器
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...