暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。
既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下:
public class ShapeFrame extends JFrame {
public void initUI(){
this.setTitle("线程动画");
this.setSize(700, 600);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
}
界面写好了,让线条动起来的前提是与一条线,所以接下来就要画线了,那就再创建一个类,在这个类中画出线条并定义运动的函数,需要定义的有线条的起始点,终点的坐标,运动的方向和速度,比较特别的是还需要定义一个方向的变量,变量的初始化我是将其全部定义在构造函数中,也可以在定义时初始化,这里将方向dir初始化为右。
接下来就要写出画线的函数,函数如下:
public void drawLine(Graphics2D g){
g.setStroke(new BasicStroke(width));
g.setColor(Color.BLACK);
g.drawLine(x1, y1, x2, y2);
}
主要有设置颜色,传递画笔,Graphics2D类继承了Graphics类,所以使用它创建画笔对象。
有了线条,下一步就是让它动以来,开始时先做简单的运动,上下左右四个方向的直线运动,这时别忘了定义方向变量,example:private static final int LEFT = 1;
以向右为例,mov函数使用switch(dir)判断,每个case中主要有两个操作,将x1,x2加上运动速度,在判断是否越界,若越界的话,就向另一个方向运动。实现:
switch (dir) {
case LEFT:
x1-=speed;
x2-=speed;
if(x1<=0){
dir=UP;
}
为了防止线条只增不减,还需要写一个清除的函数,这时还需定义四个变量,并在运动函数中将之前线条的起始终止坐标赋给这四个变量。函数中与画黑线相对,画白线就好。这是因为在运动前就将原坐标赋给后面用的四个变量,即画白线的地方是上一次画黑线的地方。所以画出来的效果就像运动起来一样。在调用这三个函数时,顺序应该是move--->clear-->drawline。否则会出现断断续续的黑白线。
只是这样,运行起来是不能画出线条的,还需要加上在窗体类中监听,这就有需要一个类实现接口,并在类中定义三个对象:
private ShapeFrame sf;
private ShapeLine line;
private Graphics2D g;
然后写构造函数:
public ThreadListener(ShapeFrame sf) {
this.sf = sf;
g = (Graphics2D) sf.getGraphics();
}
这是用于创建监听时传递窗体对象。
再在run函数里边依次调用move--->clear-->drawline,并且在异常处理中是线程睡眠500ms。这里的run函数是在继承MouseAdapter和实现Runnable后自动添加的函数,是定义在Runnable接口中的函数。在mouseReleased中创建划线类的对象,用于run中的判断。实现接口时,可重写接口中的函数。
接下来就只需要在窗口类中加上监听,创建线程,并且让线程开始就可以了。需要注意的是,在创建线程时,要传递对象。代码:
ThreadListener l = new ThreadListener(this);
this.addMouseListener(l);
Thread t = new Thread(l);
t.start();
这个任务主要是为了让我们清楚线程的使用,就我的体会而言,加监听器是需要实现Runnable类,并使用了run函数。仅仅做了这个小项目,只是会使用线程,但对线程的理解并不清楚,还需要加深思考和理解。
相关推荐
多线程建立初始化 ,pv操作 线程间通信
很好的多线程入门程序,一共四个,希望大家支持,编写环境vs2008,语言c#
易语言线程初始化.....
一个线程组代表了一系列的线程。并且,一个线程组可以包括其他的线程组。除了初始线程组外,每个线程组都有一个父线程组,类似于树的结构。
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。...main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。
python 多线程程序运行中,会出现由于异常而导致某线程停止的情况,为了保证程序的稳定运行,需要...3.隔一段时间使用threading.enumerate()获取当前所有线程对象,与初始线程组对比,如果某个name缺失,则重新start。
这是个用C#编写的关于线程的小例子,供初始接触线程的程序员了解,谢谢
操作系统,简单分区,课程设计的简单程序 public class Fenqu { ...//测试数据:初始线程驻留区表 public Thread_residence_memory[] thread_residence_memory1 = new Thread_residence_memory[3];
g++中的局部静态变量的初始化机制及线程安全
1 2.1有关线程你必须知道的事 3 2.3volatile与Java内存模型(JMM) 2 2.2初始线程:线程的基本操作 4 2.4分门别类的管理:线程组 2java并行程序基础 5 2.5驻守后台:守护线程(Daemon) 6 2.6先做重要的事:线程...
linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...
阶段3:创建初始线程,以及它的栈和执行环境 308 阶段4:将新进程通知Windows子系统 309 阶段5:启动初始线程的执行 310 阶段6:在新进程环境下执行进程初始化 310 6.3 线程的内部机理 313 数据结构 313 内核变量 ...
实验4 线程编程实验.doc
并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2. 定义结构体:用做线程函数的参数传递 typedef struct Threadinfo{ CProgressCtrl *progress;//进度条...
可以设定buffer的初始块及数量,初始块是固定大小的,当需要扩环时会动态创建块即不像其它的库块满了就写失败了,当释放时会将动态创建的块还给系统,初始块还给自己的内存池,而且支持异步读写buffer,和asio配合...
特点:可替代API CreateThread来创建线程,且自动对线程进行初始化,线程函数中不再需要初始化线程就可以使用对象、类、窗口等。提供多达四个线程参数,如果不够用的可通过结构体扩展,通过API声明使用,大大简化...
线程和进程的区别.txt线程和进程的区别.txt线程和进程的区别.txt线程和进程的区别.txt
完成数据初始化,修改进度条组件进度变化的线程类
3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...
某网络系统有N个工作线程和1个调度服务进程,作线 星初始化时 守候队列中等待;当用户请求到达时,由服务进程唤醒工作线程执;若工线程守候队列为空则则检查请求等待队列是否已满(最多可存放M个用户请求),未满则将...