JAVA程序设计实验报告
姓 名 | 王锐 | 学 号 | 182054424 | 班 级 | 1820544 | 成 绩 | |
设备名称及软件环境 | Win10、Eclipse | ||||||
实验名称 | 多线程与输入输出 | 实验日期 | 2020.06.02 | ||||
一.实验内容 1、P316页 C13_2通过两个线程实现“Java now!”与矩形框再屏幕上呈相反方向不停的走动。 2、编写一个HelloWorld.java,选择合适的输入输出流将源程序文件复制一份到“”文件中、并同时将文件的内容打印到命令提示符窗口中。 | |||||||
2.理论分析或算法分析 1. 利用继承JFrame 类和实现 Runnable 接口方法来实现题目要求, 可分为一下几个步骤: (1) “Java now !” 标签实现: 因为要对其进行控制,我们可以使用一个标志位flag 来使程序中断。flag标志位默认为true,当按下开始按钮时,多线程开始执行,标签随之移动,(此处标签移动可以通过改变位置,使用repaint调动paint方法不断进行重绘);当按下暂停按钮的时候,在事件处理方法中,将flag标志位置为false,多线程停止,标签随之暂停移动;当按下继续按钮的时候,同理flag置为true,继续移动即可。 (2) 矩形框移动实现,只需创建一个多线程,让其不断执行,通过repaint改变其位置,不断移动即可。 (3) 主类中简单绘制一个GUI界面,将标签和矩形框以及三个控制标签的按钮(开始,暂停,继续)加入其中,并给按钮设置事件处理函数,当按下时处理相应的事件即可。 2. I/O流操作 (1) “HelloWorld.java” 文件中输出一句话 “Hello world !” (2) “Test.java” 文件中,使用字符输入/输出流,通过FileReader读取 “HelloWorld.java” 文件内容,并通过FileWriter写入 “” 文件中,最后通过PrintWriter 将文件内容打印在屏幕上。 | |||||||
三.实现方法(含实现思路、程序流程图和源程序列表等) 1. 源代码 // CString.java package test; import java.awt.*; import javax.swing.JPanel; /** * 移动标签 * @author ruochen * @version 1.0 */ public class CString extends JPanel implements Runnable{ int x = 50; int y = 50; String Message = "Java now!"; Font f = new Font("TimesRoman", Font.BOLD, 24); /** 标志位 */ boolean flag = true; @Override public void run() { // 使线程中断的方式,通过flag使run()方式中断 while (flag == true) { x = x - 5; if (x == 0) { x = 300; } // 会调用paint()方法 repaint(); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); break; } } } 剩余代码见附页 | |||||||
四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等) 1. 运行结果 基本实现了题目要求。 2. 运行结果 | |||||||
报告提交日期 | |||||||
(注意:内容写不下时可另附页。)
附:
1. //CString.java(续)
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setFont(f);
g2.drawString(Message, x, y);
并输出 }
}
// CSquare.java
/*
* 若尘
*/
package test;
import java.awt.Graphics;
import java.awt.Graphics2D;
import Rectangle2D;
import javax.swing.JPanel;
/**
* 移动矩形
* @author ruochen
* @version 1.0
*/
public class CSquare extends JPanel implements Runnable{
int x1, y1, w1, h1;
Thread th2 = new Thread(this);
public CSquare() {
x1 = 5;
y1 = 50;
w1 = 40;
h1 = 40;
start();
}
private void start() {
th2.start();
}
@Override
public void run() {
while (true) {
x1 = x1 + 5;
if (x1 == 250) {
x1 = 0;
}
repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
Rectangle2D.Double rec1 = new Rectangle2D.Double(x1, y1, w1, h1);
g2.draw(rec1);
}
}
// RunnableTest.java
/*
* 若尘
*/
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 通过两个线程实现标签与矩形框反方向移动
* @author ruochen
* @version 1.0
*/
public class RunnableTest extends JFrame{
Container cp = ContentPane();
JButton bt1 = new JButton("开始");
JButton bt2 = new JButton("暂停");
JButton bt3 = new JButton("继续");
JPanel pa2 = new JPanel();
CString pa = new CString();
CSquare pa1 = new CSquare();
public void init() {
// 设置CString 的大小
pa.setPreferredSize(new Dimension(300, 150));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论