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小时内删除。