#### 说明

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. G 唐纳德与子串(easy)(华师网络赛---字符串,后缀数组)(丧心病狂的用后缀自动机A了一发Easy)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字符.这里,我们使用 s[l…r] 来 ...

  2. 【LeetCode】020. Valid Parentheses

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  3. Sentry的要点

    1.Apache的Build 在研究Sentry的时候,发现没有bin.jar,只能手工编辑工程,但是编辑发现很多jar包有问题:在访问官网的时候发现左侧菜单中有一项是builds,点开后(https ...

  4. bzoj 3994 约数个数和 —— 反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 推导过程和这里一样:https://www.cnblogs.com/MashiroSk ...

  5. linux日常管理-rsync_ssh方式

    现在我们有两台机器,两台机器都需要安装rsync    yum -y install rsync       一台的主机名是wangshaojun IP是192.168.1.117 ,另一台的主机名是 ...

  6. %.*s, printf

    %.*s_百度搜索 c语言%.*s是什么_百度知道 *用来指定宽度,对应一个整数 .(点)与后面的数合起来 是指定必须输出这个宽度,如果所输出的字符串长度大于这个数,则按此宽度输出,如果小于,则输出实 ...

  7. idea崩溃导致的svn插件丢失问题, maven dependencies视图丢失问题

    Idea丢失Svn解决办法 今天打开Idea,习惯用ctrl+t来更新svn,杯具出现了,快捷键失效了,我觉得可能是其他的什么软件占用了这个快捷键,于是重启了一下,发现还是不行,svn信息怎么没了,c ...

  8. 伪分布模式 hive查询

    [root@node1 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian ...

  9. SM4算法的c++实现

    百度到的论文已给出算法. flag为1为解密,flag为0是加密. #include<bits/stdc++.h> using namespace std; typedef long lo ...

  10. 使用JFileChooser保存文件

    --------------------siwuxie095                                 工程名:TestFileChooser 包名:com.siwuxie095 ...