实现第个气泡中心显示一个字,在框中随意运动,用空格键按下运行停止,再按下左键运动继续。用鼠标左键按下选中的圆变为填充的,再次按下又变为不填充的。

参考 https://github.com/liuyubobobo/

AlgoVisualizer.java
import java.awt.*;
import java.awt.event.*;public class AlgoVisualizer {private Object data;private Circle[] circles;private AlgoFrame frame;private boolean isAnmiated = true;public AlgoVisualizer(int sceneWidth, int sceneHeight, int N){circles = new Circle[N];int R = 50;for(int i = 0; i < N; i++){int x = (int)(Math.random()*(sceneWidth-2*R)) + R;int y = (int)(Math.random()*(sceneHeight-2*R)) + R;int vx = (int)(Math.random()*11) - 5;int vy = (int)(Math.random()*11) - 5;circles[i] = new Circle(x, y, R, vx, vy);}EventQueue.invokeLater(()->{frame = new AlgoFrame("Welcome-Java", sceneWidth, sceneHeight);frame.addKeyListener(new AlgoKeyListener());frame.addMouseListener(new AlgoMouseListener());new Thread(()->{run();}).start();});}public AlgoVisualizer(int sceneWidth, int sceneHeight, int N, String centerLael){Circle.showLabel = true;circles = new Circle[N];int R = 50;for(int i = 0; i < N; i++){int x = (int)(Math.random()*(sceneWidth-2*R)) + R;int y = (int)(Math.random()*(sceneHeight-2*R)) + R;int vx = (int)(Math.random()*11) - 5;int vy = (int)(Math.random()*11) - 5;circles[i] = new Circle(x, y, R, vx, vy);circles[i] = new Circle(x, y, R, vx, vy, centerLael.charAt(i) + "");}EventQueue.invokeLater(()->{frame = new AlgoFrame("Welcome-Java", sceneWidth, sceneHeight);frame.addKeyListener(new AlgoKeyListener());frame.addMouseListener(new AlgoMouseListener());new Thread(()->{run();}).start();});}private void run(){while(true){//绘制当前数据frame.render(circles);AlgoVisHelper.pause(20);//更新数据if(isAnmiated){for(Circle circle:circles)circle.move(0, 0, frame.getCanvasWidth(), frame.getCanvasHeight());}}}private class AlgoKeyListener extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent event){if(event.getKeyChar() == ' '){isAnmiated = !isAnmiated;}}}private class AlgoMouseListener extends MouseAdapter{@Overridepublic void mousePressed (MouseEvent event){event.translatePoint(0,
//                    (frame.getBounds().height -frame.getCanvasHeight()));-(frame.getBounds().height -frame.getCanvasHeight()));//            System.out.println(event.getPoint());for(Circle circle:circles){if(circle.contain(event.getPoint())){circle.isFilled = !circle.isFilled;}}}}public static void main(String[] args) {String poemData = "三月七日沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词 \n" +"莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕? 一蓑烟雨任平生。\n" +"料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。";int sceneWidth = 800;int sceneHeight = 800;int N = 15;//        AlgoVisualizer visualizer = new AlgoVisualizer(sceneWidth, sceneHeight, N);AlgoVisualizer visualizer = new AlgoVisualizer(sceneWidth, sceneHeight, N, poemData);}
}
AlgoFrame.java
import javax.swing.*;
import java.awt.*;public class AlgoFrame extends JFrame {private int canvasWidth;private int canvasHeight;public AlgoFrame(String title, int canvasWidth, int canvasHeight){super(title);this.canvasHeight = canvasHeight;this.canvasWidth = canvasWidth;AlgoCanvas canvas = new AlgoCanvas();setContentPane(canvas);pack();setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}public AlgoFrame(String title){this(title, 1024, 768);}public int getCanvasWidth(){return  canvasWidth;}public int getCanvasHeight() {return canvasHeight;}private Circle[] circles;public void render(Circle[] circles){this.circles = circles;repaint();}private Object data;public void render(Object data){this.data = data;repaint();}private class AlgoCanvas extends JPanel{public AlgoCanvas(){super(true);}@Overridepublic void paintComponent(Graphics g){super.paintComponent(g);Graphics2D g2d =(Graphics2D)g;RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g2d.addRenderingHints(hints);AlgoVisHelper.setStrokeWidth(g2d, 1);AlgoVisHelper.setColor(g2d, Color.RED);g2d.setFont( new Font("SimSun", Font.BOLD, 16));for (Circle circle: circles){if(!circle.isFilled){AlgoVisHelper.strokeCircle(g2d, circle.x, circle.y, circle.getR() );}else{AlgoVisHelper.fillCircle(g2d, circle.x, circle.y, circle.getR());}if(Circle.showLabel){
//                    AlgoVisHelper.showPoem(g2d,circle.x, circle.y, circle.centerLabel);AlgoVisHelper.drawText(g2d,circle.centerLabel,circle.x, circle.y);}}}@Overridepublic Dimension getPreferredSize(){
//            System.out.println("Run getPreferredSize()");return new Dimension(canvasWidth, canvasHeight);}}
}
Circle.java
import java.awt.*;public class Circle {public int x, y;private int r;public int vx, vy;public String centerLabel;static public boolean showLabel = false;public boolean isFilled = false;public Circle(int x, int y, int r, int vx, int vy){this.x = x;this.y = y;this.r = r;this.vx = vx;this.vy = vy;}public Circle(int x, int y, int r, int vx, int vy, String centerLabel){this.x = x;this.y = y;this.r = r;this.vx = vx;this.vy = vy;this.centerLabel = centerLabel;}public int getR(){return r;}public void move(int minx, int miny, int maxx, int maxy){x += vx;y += vy;checkCollision(minx, miny, maxx, maxy);}private void checkCollision(int minx, int miny, int maxx, int maxy) {if (x - r < minx) {x = r;vx = -vx;}if (x + r >= maxx) {x = maxx - r;vx = -vx;}if (y - r < miny) {y = r;vy = -vy;}if (y + r >= maxy) {y = maxy - r;vy = -vy;}}public boolean contain(Point p){return (x - p.x) * (x - p.x) + (y - p.y)*(y - p.y) <= r*r;}}
AlgoVisHelper.java
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;public class AlgoVisHelper {private AlgoVisHelper(){}public static void setStrokeWidth(Graphics2D g2d, int w){int strokeWidth = w;g2d.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));}public static void strokeCircle(Graphics2D g2d, int x, int y, int r){Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);g2d.draw(circle);}public static void fillCircle(Graphics2D g2d, int x, int y, int r){Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);g2d.fill(circle);}public static void strokeRectangle(Graphics2D g2d, int x, int y, int w, int h){Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);g2d.draw(rectangle);}public static void fillRectangle(Graphics2D g2d, int x, int y, int w, int h){Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);g2d.fill(rectangle);}public static void putImage(Graphics2D g2d, int x, int y, String imageURL){ImageIcon icon = new ImageIcon(imageURL);Image image = icon.getImage();g2d.drawImage(image, x, y, null);}public  static void drawText(Graphics2D g2d, String text, int centerx, int centery){if(text == null)throw new IllegalArgumentException("Text is null");FontMetrics metrics = g2d.getFontMetrics();int w = metrics.stringWidth(text);int h = metrics.getDescent();g2d.drawString(text, centerx - w/2, centery + h);}public static void showPoem(Graphics2D g2d,  int x, int y, String poem){g2d.drawString(poem,x, y);//        g2d.drawString("醉", x, y);}public static void setColor(Graphics2D g2d, Color color){g2d.setColor(color);}public static void pause(int t){try{Thread.sleep(t);}catch (InterruptedException e){System.out.println("Error in sleepping");}}}

Java GUI气泡诗词相关推荐

  1. Java GUI气泡诗词02

    Java GUI气泡诗词_天人合一peng的博客-CSDN博客 import java.awt.*; import java.awt.event.*;public class AlgoVisualiz ...

  2. 【毕设进行时-工业大数据,数据挖掘】Java GUI完善,左对齐

    正文之前 今天早上起来,因为还要在宿舍这边搞毕业信息确认,所以没办法,我就只能在宿舍里面做一下Java 的GUI的优化了! 很幸运的,思索一番之后,我发现了问题所在,并且很快的就解决了.就在我想要继续 ...

  3. java gui 结构_java gui教学图形界面的层次结构.ppt

    java gui教学图形界面的层次结构.ppt 还剩 13页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 事件 ...

  4. java 中gui的作用_java学习中最应该注意的Java GUI用户界面以何为基础

    java中的GUI编程(Graphic User Interface,图形用户接口),是在它的笼统窗(Abstract Window Toolkit,AWT)上完成的,java.awt是AWT的东西类 ...

  5. Java GUI:将JPanel添加进JScrollPane

    实现的目标: 因为在滚动框中含有很多个Java GUI 组件,因此这里采用JPanel面板包住这些组件,在用JScrollPane实现滚动 问题1:布局揉在一起 JPanel有自己默认的布局方式,因此 ...

  6. Java GUI 开发专题

    Java GUI 开发专题 IBM http://www.ibm.com/developerworks/cn/java/j-gui/#N10095 作者:wenhai_zhang 发表于2009-11 ...

  7. Java GUI应用程序关闭陷阱

    最近,我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题. 它们似乎是一个过程,消耗着计算机资源. 今天,我深入探究了问题的根源,这是一个我以前从未意识到的棘手问题,所以我想我会分享一下 ...

  8. java gui介绍_IntelliJ IDE 开发Java GUI 入门

    原标题:IntelliJ IDE 开发Java GUI 入门 j主要对java 的GUI相关知识进行简单的介绍和总结,整个博客按照创建一个java GUI的顺序进行介绍,期间穿插讲解用到的java S ...

  9. 实验五 java gui

    实验五 图形化应用程序开发 <center> <strong>姓名:</strong> <u>XXX</u>    <strong&g ...

最新文章

  1. SQL中 decode()函数简介
  2. oracle dataguard in-memory,Oracle 11g Dataguard 物理备库配置(一)之Duplicate配置
  3. QT5实现简单的TCP通信
  4. java学习_都说Java难学,不知道具体的学习内容?全套Java学习路线送上
  5. 语句include和require的区别是什么?
  6. java只允许一个用户登陆_spring boot security只允许一个用户(test1)登录
  7. java 拦截html请求参数值_javaweb项目,html文件放在了WebRoot下,如何拦截访问html的请求呀?...
  8. sphereface result
  9. python自动化框架学习-pyautogui
  10. linux恢复rm删除文件ssd,科学网—linux恢复rm -rf删除的文件 - 罗晓光的博文
  11. 未来PCB行业互联网+发展趋势
  12. python桌面程序臃肿_Python自动化整理文件“大升级”,任意路径下文件,都给你整理的明明白白!...
  13. 关于数据科学的十本好书
  14. Linux启动流程详解
  15. python真的能赚钱吗,学python可以赚钱吗
  16. 深度神经网络的训练过程,深度神经网络如何训练
  17. Java集合--阻塞队列(LinkedBlockingQueue)
  18. 无法删除状态为Dead的容器
  19. HDU2604Queuing
  20. PL/SQL 入门学习(一)

热门文章

  1. GLES2.0中文API-glBindAttribLocation
  2. [JAVA使用技巧]Java抽取Word和PDF格式文件_网络大本营
  3. 我眼中的《芳华》读后感作文2500字
  4. java速记_spring复习速记
  5. 2020年985大学计算机分数线,2020年985大学名单分数线
  6. 《HTML5 2D游戏编程核心技术》——第1章,第1.5节开始Snail Bait游戏编程
  7. linux用飞信发短信
  8. 计算机后面板音乐开关,如何开关Windows启动与关机时的音乐声
  9. [js]javascript实现多个json对象及列表的美化,容错非法json
  10. Qt数据库应用19-图片转pdf