📄 fans.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Font;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.util.*;
public class Fans
{
public static void main(String[] args)
{
FanFrame frame = new FanFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class FanFrame extends JFrame
{
public FanFrame()
{
setTitle("风扇");
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
setSize(700,350);
setLocation(screenWidth/4,screenHeight/4);
mainPanel panel = new mainPanel();
add(panel);
}
}
class mainPanel extends JPanel
{
private FanPanel p1;
private FanPanel p2;
private FanPanel p3;
public mainPanel()
{
setLayout(new BorderLayout());
JPanel bottomPanel = new JPanel();
JButton startallButton = new JButton("StartAll");
JButton stopallButton = new JButton("StopAll");
bottomPanel.add(startallButton);
bottomPanel.add(stopallButton);
add(bottomPanel,BorderLayout.SOUTH);
startallButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
p1.setRunning(true);
p2.setRunning(true);
p3.setRunning(true);
}
});
stopallButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
p1.setRunning(false);
p2.setRunning(false);
p3.setRunning(false);
}
});
//网格布局
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(1,3));
p1=new FanPanel();new Thread(new RunFan(p1)).start();
p2=new FanPanel();new Thread(new RunFan(p2)).start();
p3=new FanPanel();new Thread(new RunFan(p3)).start();
panel.add(p1);
panel.add(p2);
panel.add(p3);
add(panel);
}
}
class FanPanel extends JPanel
{
private boolean isrunning = false;
private boolean isreverse = false;
private int startArc = 0;//绘制风扇的起始弧度
private int rapid = 30;//控制转速
public boolean getRunning()
{
return isrunning;
}
public void setRunning(boolean tof)
{
isrunning = tof;
}
public boolean getReverse()
{
return isreverse;
}
public void setReverse(boolean tof)
{
isreverse = tof;
}
public int getStartArc()
{
return startArc;
}
public void setStartArc(int i)
{
startArc = i;
}
public int getRapid()
{
return rapid;
}
public FanPanel()
{
//设置每个单独风扇面板的边界
Border etched=BorderFactory.createLineBorder(Color.BLACK);
setBorder(etched);
setLayout(new BorderLayout());
//单独的一个风扇面板
JPanel Fpanel = new JPanel();
JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton reverseButton = new JButton("Reverse");
Fpanel.add(startButton);
Fpanel.add(stopButton);
Fpanel.add(reverseButton);
add(Fpanel,BorderLayout.NORTH);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
isrunning = true;
}
});
stopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
isrunning = false;
}
});
reverseButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
isreverse = !getReverse();//设置反转标记为当前值的"反"
}
});
//添加滑块
JPanel JSpanel = new JPanel();
JSlider slider = new JSlider(0,60,30);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
JSpanel.add(slider);
add(JSpanel,BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider)event.getSource();
//获取滑块当前指示的值
rapid = source.getValue();
}
});
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2= (Graphics2D) g;
double leftX = 20;
double topY = 50;
double width = 200;
double height = 150;
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 75;
Ellipse2D circle1 = new Ellipse2D.Double();
circle1.setFrameFromCenter(centerX,centerY,centerX+radius,centerY+radius);
g2.draw(circle1);
Arc2D a1=new Arc2D.Double(leftX+30,topY+5,2*(radius-5),2*(radius-5),startArc,30,Arc2D.PIE );
Arc2D a2=new Arc2D.Double(leftX+30,topY+5,2*(radius-5),2*(radius-5),startArc+90,30,Arc2D.PIE );
Arc2D a3=new Arc2D.Double(leftX+30,topY+5,2*(radius-5),2*(radius-5),startArc+180,30,Arc2D.PIE );
Arc2D a4=new Arc2D.Double(leftX+30,topY+5,2*(radius-5),2*(radius-5),startArc+270,30,Arc2D.PIE );
g2.draw(a1);g2.draw(a2);g2.draw(a3);g2.draw(a4);
g2.setPaint(Color.RED);
g2.fill(a1);g2.fill(a2);g2.fill(a3);g2.fill(a4);
repaint();
}
}
class RunFan implements Runnable
{
private FanPanel fanP;
public RunFan(FanPanel p)
{
this.fanP = p;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(fanP.getRunning())
{
if(fanP.getReverse())
{
fanP.setStartArc((fanP.getStartArc()-fanP.getRapid())%360);
}
else
{
fanP.setStartArc((fanP.getStartArc()+fanP.getRapid())%360);
}
fanP.repaint();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -