综合实验
实验编号: 实验七
实验主题: 综合实验
实验目的: (1)掌握图形化用户界面的设计和实现; (2)掌握文件的处理; (3)掌握事件处理的方法; (4)掌握多线程的设计和实现; (5)掌握图形绘制的方法。
实验要求: (1)综合掌握实验中涉及的多个知识点; (2)在NetBeans或Eclipse环境下完成选做实验内容; (3)认真撰写完整的实验报告。
实验步骤: (1)设计类和程序的结构; (2)在NetBeans或Eclipse中创建工程; (3)设计和实现图形化用户界面中的各种组成部件; (4)为图形化用户界面添加事件处理; (5)编译、调试、运行和发布程序。
实验提示: (1)程序发布可以使用集成化开发环境中的提供的工具; (2)可通过学习开发环境自带的帮助文件熟悉开发环境的使用。
题目7-1:简单文本编辑器
该程序可以新建、打开、编辑和保存文本文件。当用户点击New时,新建一个文件,用户可以编辑文件内容,然后点击Save保存文件。用户点击Open时,选择一个已有文件,然后可对文件进行编辑。示例输出如图所示。
在这里插入代码片
题目7-2:风扇
编写程序,显示3个风扇,用控制按钮开动和停止风扇。可以同时开动和停止3个风扇,也可以分别开动和停止每一个风扇。输出示例如图所示。
分了四个类写完的,完成了上面的所有功能,这个Rev…我推测是reverse,改变旋转方向的,下面的滑块条改变转动速度的。
结果:
代码如下:
FanPanel:实现了风扇的绘制与旋转。
package test7;
import javax.swing.*;
import java.awt.*;
public class FanPanel extends JPanel{
int angle1 = 10, angle2 = 100, angle3 = 190, angle4 = 280;
int c;
int x;
// 重写paint方法
public void paint(Graphics g) {
// 必须先调用父类的paint方法
super.paint(g);
int x = 56;
int y =55;
int w = 170;
int h = 170;
g.drawArc(51, 50, 180, 180, 0, -360);
g.drawLine(299, 0, 299, 260);
// 绘制扇形
g.setColor(Color.red);
// g.fillArc(x, y, width, height, startAngle, arcAngle);
// fillArc代表填充图,startAngle代表开始弧度,arcAngle代表偏转角度
// 可通过测试g.fillArc(0, 0, 100, 200, 0, 90)明白各个含义
g.fillArc(x, y, w, h, angle1 + c, -30);
g.fillArc(x, y, w, h, angle2 + c, -30);
g.fillArc(x, y, w, h, angle3 + c, -30);
g.fillArc(x, y, w, h, angle4 + c, -30);
}
// 旋转
public void Rotate(int num, int rev) {
if(rev % 2 == 0) c += x;
else c -= x;
try
{
Thread.sleep(100/num);
}catch(Exception e)
{
e.printStackTrace();
}
repaint();
}
}
FanFrame:实现了各个按钮和风扇的布局,整个页面架起来了。
package test7;
import javax.swing.*;
//import java.awt.*;
import java.awt.event.*;
public class FanFrame extends JFrame implements ActionListener,AdjustmentListener{
// flag_n代表第n个风扇是否开始
boolean flag_1 = false;
boolean flag_2 = false;
boolean flag_3 = false;
// 是否改变旋转方向
int rev_1 = 0;
int rev_2 = 0;
int rev_3 = 0;
// 第一个风扇按钮与滑动条
JButton start1 = new JButton("Strat");
JButton stop1 = new JButton("Stop");
JButton reverse1 = new JButton("Reverse");
JScrollBar speed1 =new JScrollBar(JScrollBar.HORIZONTAL,1,10,0,50);
// 第二个风扇按钮与滑动条
JButton start2 = new JButton("Strat");
JButton stop2 = new JButton("Stop");
JButton reverse2 = new JButton("Reverse");
JScrollBar speed2 =new JScrollBar(JScrollBar.HORIZONTAL,10,10,0,50);
// 第三个风扇按钮与滑动条
JButton start3 = new JButton("Strat");
JButton stop3 = new JButton("Stop");
JButton reverse3 = new JButton("Reverse");
JScrollBar speed3 =new JScrollBar(JScrollBar.HORIZONTAL,20,10,0,50);
// 全部开始与全部结束
JButton start = new JButton("Start All");
JButton stop = new JButton("Stop All");
// 三个panel
FanPanel p1 = new FanPanel();
FanPanel p2 = new FanPanel();
FanPanel p3 = new FanPanel();
public FanFrame() {
// 设置Frame基本属性
setTitle("Three-Fan");
setBounds(200, 100, 915, 400);
setVisible(true);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
start.setBounds(300, 300, 100, 50);
start.addActionListener(this);
stop.setBounds(450, 300, 100, 50);
stop.addActionListener(this);
add(start);
add(stop);
p1.setLayout(null);
add(p1);
p2.setLayout(null);
add(p2);
p3.setLayout(null);
add(p3);
//
p1.setBounds(0, 0, 300, 300);
p3.setBounds(600, 0, 300, 300);
p2.setBounds(300, 0, 300, 300);
// 设置p1按钮
start1.setBounds(0, 0, 100, 30);
start1.addActionListener(this);
stop1.setBounds(100, 0, 100, 30);
stop1.addActionListener(this);
reverse1.setBounds(200, 0, 100, 30);
reverse1.addActionListener(this);
speed1.setBounds(0, 242, 300, 20);
p1.x = speed1.getValue();
speed1.addAdjustmentListener(this);
// speed1.addAdjustmentListener(new AdjustmentListener() {
// public void adjustmentValueChanged(AdjustmentEvent e) {
// p1.c = e.getValue();
// }
// 设置p2按钮
start2.setBounds(0, 0, 100, 30);
start2.addActionListener(this);
stop2.setBounds(100, 0, 100, 30);
stop2.addActionListener(this);
reverse2.setBounds(200, 0, 100, 30);
reverse2.addActionListener(this);
speed2.setBounds(0, 242, 300, 20);
p2.x = speed2.getValue();
speed2.addAdjustmentListener(this);
// 设置p3按钮
start3.setBounds(0, 0, 100, 30);
start3.addActionListener(this);
stop3.setBounds(100, 0, 100, 30);
stop3.addActionListener(this);
reverse3.setBounds(200, 0, 100, 30);
reverse3.addActionListener(this);
speed3.setBounds(0, 242, 300, 20);
p3.x = speed3.getValue();
speed3.addAdjustmentListener(this);
// 添加p1按钮
p1.add(stop1);
p1.add(start1);
p1.add(reverse1);
p1.add(speed1);
// 添加p2按钮
p2.add(stop2);
p2.add(start2);
p2.add(reverse2);
p2.add(speed2);
// 添加p3按钮
p3.add(stop3);
p3.add(start3);
p3.add(reverse3);
p3.add(speed3);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start1) {
flag_1 = true;
}
else if(e.getSource() == stop1) {
flag_1 = false;
}
else if(e.getSource() == reverse1) {
rev_1 = (rev_1 + 1) % 10;
}
else if(e.getSource() == start2) {
flag_2 = true;
}
else if(e.getSource() == stop2) {
flag_2 = false;
}
else if(e.getSource() == reverse2) {
rev_2 = (rev_2 + 1) % 10;
}
else if(e.getSource() == start3) {
flag_3 = true;
}
else if(e.getSource() == stop3) {
flag_3 = false;
}
else if(e.getSource() == reverse3) {
rev_3 = (rev_3 + 1) % 10;
}
else if(e.getSource() == start) {
flag_1 = true;
flag_2 = true;
flag_3 = true;
}
else if(e.getSource() == stop) {
flag_1 = false;
flag_2 = false;
flag_3 = false;
}
}
public void adjustmentValueChanged(AdjustmentEvent e) {
if ((JScrollBar) e.getSource() == speed1)
p1.x = e.getValue();// e.getValue()所得的值与scrollBar1.getValue()所得的值一样。
if ((JScrollBar) e.getSource() == speed2)
p2.x = e.getValue();
if ((JScrollBar) e.getSource() == speed3)
p3.x = e.getValue();
}
}
FanRun:进程,调用函数,实现风扇的运行。
package test7;
import java.util.concurrent.locks.*;
import javax.swing.*;
public class FanRun extends Thread{
FanFrame f = new FanFrame();
public FanRun() {
run();
}
final Lock l = new ReentrantLock();
public void run() {
while(true) {
l.lock();
if(f.flag_1==false&&f.flag_2==false&&f.flag_3==false) {
continue;
}
else if(f.flag_1==true&&f.flag_2==false&&f.flag_3==false) {
f.p1.Rotate(1, f.rev_1);
}
else if(f.flag_1==false&&f.flag_2==true&&f.flag_3==false) {
f.p2.Rotate(1, f.rev_2);
}
else if(f.flag_1==false&&f.flag_2==false&&f.flag_3==true) {
f.p3.Rotate(1, f.rev_3);
}
else if(f.flag_1==true&&f.flag_2==true&&f.flag_3==false) {
f.p1.Rotate(2, f.rev_1);
f.p2.Rotate(2, f.rev_2);
}
else if(f.flag_1==true&&f.flag_2==false&&f.flag_3==true) {
f.p1.Rotate(2, f.rev_1);
f.p3.Rotate(2, f.rev_3);
}
else if(f.flag_1==false&&f.flag_2==true&&f.flag_3==true) {
f.p3.Rotate(2, f.rev_3);
f.p2.Rotate(2, f.rev_2);
}
else if(f.flag_1==true&&f.flag_2==true&&f.flag_3==true) {
f.p1.Rotate(3, f.rev_1);
f.p2.Rotate(3, f.rev_2);
f.p3.Rotate(3, f.rev_3);
}
l.unlock();
}
}
}
FanMain:主函数
package test7;
public class FanMain {
public static void main(String[] args) {
FanRun A = new FanRun();
FanRun B = new FanRun();
FanRun C = new FanRun();
A.start();
B.start();
C.start();
}
}
题目7-3:画笔
编写应用程序,可以绘制图形、保存绘制结果和打开已绘图形。可以选择要绘制图形的形状和颜色,选择是否填充,绘制相应的图形,并且可保存到文件中。示例输出如图所示。
没写,但是网上找到个很有用的教程,照着应该能写出来。 java画图板
在这里插入代码片
题目7-4:拼图游戏
编写拼图游戏程序,拼图由33方格组成。将原始图像分成33个方块,打乱顺序后放入方格中,用户通过移动方格将图像恢复为原始图像。 程序包括多张原始图像,每次随机选择一个图像。示例输出如图所示。
在这里插入代码片
题目7-5:图书借阅第三版
修改Java程序设计(六)中的图书借阅版本2,将数据保存在数据库中或文件中,采用图形化用户界面,实现图书的入库,借阅和归还。
在这里插入代码片
题目7-6:计算器
编写程序,实现一个计算器,可以进行+,-,,/的运算。操作步骤:用户通过鼠标点击输入第一个操作数,点击+,-,,/按钮选择运算,然后输入第二个操作数,最后点击=按钮,在文本框中显示计算结果。用户点击数字按钮时,文本域中显示已经输入的数字,可以输入整数和小数。用户点击+,-,*,/时,文本域清空,准备显示下一个操作数。示例输出如图所示。
在这里插入代码片