代碼内含有詳細的注釋,請讀者自行觀看,淺顯易懂
是以我就不解釋了,直接上代碼
package homework;
//自行建立package
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//author=HuangLin(BUPT)
public class Three_Fan extends Frame implements ActionListener{
MyPanel clockPanel;
//the fan is on or off
boolean flag1 = false;
boolean flag2 = false;
boolean flag3 = false;
int sign = ;//延時的設計,使得三個風扇和一個風扇的轉速保持一緻
//the angle of each fan(start)
int [] angle1 = {,,};
int [] angle2 = {-, -, -};
int [] angle3 = {-, -, -};
int [] angle4 = {, ,};
//the speed of each fan.speed>0 or <0 represent direction
int [] speed = {,,};
final Lock l = new ReentrantLock();
Button start1 = new Button("Start");
Button stop1 = new Button("Stop");
Button reset1 = new Button("Reset");
Button up_speed1 = new Button("UpSpeed");
Button down_speed1 = new Button("DownS");
Button start2 = new Button("Start");
Button stop2 = new Button("Stop");
Button reset2 = new Button("Reset");
Button up_speed2 = new Button("UpSpped");
Button down_speed2 = new Button("DownS");
Button start3 = new Button("start");
Button stop3 = new Button("Stop");
Button reset3 = new Button("Reset");
Button up_speed3 = new Button("UpSpeed");
Button down_speed3 = new Button("DownS");
Button start_all = new Button("Start_All");
Button stop_all = new Button("Stop_All");
Button ready_go = new Button("Ready_Go");
//建立三個程序
Run A = new Run();
Run B = new Run();
Run C = new Run();
Three_Fan()
{
//draw panel
clockPanel = new MyPanel();
clockPanel.setLayout(null);
start1.setBounds(, , , );
stop1.setBounds(, , , );
reset1.setBounds(, , , );
up_speed1.setBounds(, , , );
down_speed1.setBounds(, , , );
start2.setBounds(, , , );
stop2.setBounds(, , , );
reset2.setBounds(, , , );
up_speed2.setBounds(, , , );
down_speed2.setBounds(, , , );
start3.setBounds(, , , );
stop3.setBounds(, , , );
reset3.setBounds(, , , );
up_speed3.setBounds(, , , );
down_speed3.setBounds(, , , );
start_all.setBounds(, , , );
stop_all.setBounds(, , , );
ready_go.setBounds(, , , );
//action listener
start1.addActionListener(this);
stop1.addActionListener(this);
reset1.addActionListener(this);
up_speed1.addActionListener(this);
down_speed1.addActionListener(this);
start2.addActionListener(this);
stop2.addActionListener(this);
reset2.addActionListener(this);
up_speed2.addActionListener(this);
down_speed2.addActionListener(this);
start3.addActionListener(this);
stop3.addActionListener(this);
reset3.addActionListener(this);
up_speed3.addActionListener(this);
down_speed3.addActionListener(this);
start_all.addActionListener(this);
stop_all.addActionListener(this);
ready_go.addActionListener(this);
//add
add(start1);
add(stop1);
add(reset1);
add(up_speed1);
add(down_speed1);
add(start2);
add(stop2);
add(reset2);
add(up_speed2);
add(down_speed2);
add(start3);
add(stop3);
add(reset3);
add(up_speed3);
add(down_speed3);
add(start_all);
add(stop_all);
add(ready_go);
add(clockPanel);
}
//action listener function
public void actionPerformed(ActionEvent e) {
if(e.getSource() == ready_go)
{
A.start();
B.start();
C.start();
}
else if(e.getSource() == start1)
{
flag1 = true;
}
else if(e.getSource() == stop1)
{
flag1 = false;
}
else if(e.getSource() == reset1)
{
angle1[] = ;
angle2[] = -;
angle3[] = -;
angle4[] = ;
}
else if(e.getSource()==up_speed1){
speed[]+=;
}
else if(e.getSource()==down_speed1){
speed[]-=;
}
else if(e.getSource() == start2)
{
flag2 = true;
}
else if(e.getSource() == stop2)
{
flag2 = false;
}
else if(e.getSource() == reset2)
{
angle1[] = ;
angle2[] = -;
angle3[] = -;
angle4[] = ;
}
else if(e.getSource()==up_speed2){
speed[]+=;
}
else if(e.getSource()==down_speed2){
speed[]-=;
}
else if(e.getSource() == start3)
{
flag3 = true;
}
else if(e.getSource() == stop3)
{
flag3 = false;
}
else if(e.getSource() == reset3)
{
angle1[] = ;
angle2[] = -;
angle3[] = -;
angle4[] = ;
}
else if(e.getSource()==up_speed3){
speed[]+=;
}
else if(e.getSource()==down_speed3){
speed[]-=;
}
else if(e.getSource() == start_all)
{
flag1 = true;
flag2 = true;
flag3 = true;
}
else if(e.getSource() == stop_all)
{
flag1 = false;
flag2 = false;
flag3 = false;
}
}
class MyPanel extends JPanel
{
public void paint(Graphics g) {
//第一個
g.setColor(Color.yellow);
g.fillArc(, , , , angle1[], -);
g.fillArc(, , , , angle2[], -);
g.fillArc(, , , , angle3[], -);
g.fillArc(, , , , angle4[], -);
//第二個
g.setColor(Color.red);
g.fillArc(, , , , angle1[], -);
g.fillArc(, , , , angle2[], -);
g.fillArc(, , , , angle3[], -);
g.fillArc(, , , , angle4[], -);
//第三個
g.setColor(Color.green);
g.fillArc(, , , , angle1[], -);
g.fillArc(, , , , angle2[], -);
g.fillArc(, , , , angle3[], -);
g.fillArc(, , , , angle4[], -);
}
}
//Main
public static void main(String[] args) {
Three_Fan window = new Three_Fan();
window.addWindowListener(new WindowAdapter() //為了關閉視窗
{
public void windowClosing(WindowEvent e)
{
System.exit();
}
});
window.setBounds(, , , );
window.setTitle("My_Fan(2013211842-黃麟)");
window.setVisible(true);
window.setLayout(null);
window.setResizable(false);
}
//paint repaint
void lfl(int state)
{
angle1[state] += speed[state];
angle2[state] += speed[state];
angle3[state] += speed[state];
angle4[state] += speed[state];
try
{
Thread.sleep(/sign);
}catch(Exception e)
{
e.printStackTrace();
}
repaint();
}
//Thread
private class Run extends Thread
{
public void run()
{
while (true) {
l.lock();
if(flag1 == false && flag2 == false && flag3 == false)
{
sign = ;
continue
;
}
else if(flag1 == false && flag2 == false && flag3 == true)
{
sign = ;
lfl();
}
else if(flag1 == false && flag2 == true && flag3 == false)
{
sign = ;
lfl();
}
else if(flag1 == false && flag2 == true && flag3 == true)
{
sign = ;
lfl();
lfl();
}
else if(flag1 == true && flag2 == false && flag3 == false)
{
sign = ;
lfl();
}
else if(flag1 == true && flag2 == false && flag3 == true)
{
sign = ;
lfl();
lfl();
}
else if(flag1 == true && flag2 == true && flag3 == false)
{
sign = ;
lfl();
lfl();
}
else if(flag1 == true && flag2 == true && flag3 == true)
{
sign = ;
lfl();
lfl();
lfl();
}
l.unlock();
}
}
}
}