设计思路:
1、定时器的设计
2、图片指示器的设计绘制
3、图片尺寸比例适中绘制
code:
package my;
/*图片面板绘制*/
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.Timer;
import js.swing.JsImageScaler;
public class Carousel extends JPanel
{
public List<Image> imageList=new ArrayList<>();
private Timer timer; //定时器
private int index=0; //当前显示的第几张
private boolean showIndicator=true; //是否显示指示器
//添加一张图片
public void addImage(Image image)
{
imageList.add(image);
}
//启动定时器
public void startAnimation(int interval)
{
if(timer!=null)return;
timer=new Timer(interval,(e)->{
goNext(); //切换到下一张
});
timer.start();
}
//停止定时器
public void stopAnimation()
{
if(timer!=null)
{
timer.stop();
timer=null;
}
}
//切换到下一幅图
public void goNext()
{
index++;
if(index>=imageList.size())
{
index=0;
}
repaint();
}
@Override
protected void paintComponent(Graphics g)
{
int width = getWidth();
int height = getHeight();
Graphics2D g2d = (Graphics2D) g;
// 平滑绘制 ( 反锯齿 )
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setPaint(Color.white);
g2d.fillRect(0, 0, width, height); // 背景色
//如果没有图片则不绘制
if(imageList.size()==0)return;
//绘制当前图片
Image image=imageList.get(index);
if(image!=null)
{
int imgW=image.getWidth(null);
int imgH = image.getHeight(null);
//使用自定义图片绘制
JsImageScaler scaler=new JsImageScaler(imgW, imgH, width,height);
Rectangle fit=scaler.fitCenter();
g.drawImage(image, fit.x, fit.y, fit.width, fit.height, null);
}
//绘制序号显示器
if(showIndicator)
{
int count=imageList.size(); //图片个数
double spacing=24; //每个小方块的间距
double baseX=(width-spacing*(count-1))/2; //水平居中
double baseY=height-50; 竖直方向靠下显示
//绘制N个小方块作为页面指示器
for(int i=0;i<imageList.size();i++)
{
double x=baseX+i*spacing;
double y=baseY;
Shape shape=new Rectangle.Double(x,y,6,6);
Paint lineColor = new Color(255,255,0,200); //黄色半透明
Paint fillColor = new Color(200,200,200,100); //灰色半透明
if(i==this.index) //当前索引
{
fillColor=Color.RED; //以高亮颜色显示
}
g2d.setPaint(fillColor);
g2d.fill(shape);
g2d.setStroke(new BasicStroke(2));
g2d.setPaint( lineColor);
g2d.draw(shape);
}
}
}
}
package my;
/*主面板*/
import java.awt.BorderLayout;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MyFrame extends JFrame
{
Carousel display=new Carousel();
// 注意是 javax.swing.Timer
Timer timer;
public MyFrame(String title)
{
super(title);
// Content Pane
JPanel root = new JPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
root.add(display, BorderLayout.CENTER);
// 工具栏
Box toolbar = Box.createHorizontalBox();
JButton startButton = new JButton("开始");
JButton stopButton = new JButton("停止");
toolbar.add(startButton);
toolbar.add(Box.createHorizontalStrut(10));
toolbar.add(stopButton);
root.add(toolbar, BorderLayout.PAGE_START);
startButton.addActionListener((e)->{
display.startAnimation(1500);
});
stopButton.addActionListener( (e)->{
display.stopAnimation();
});
//添加图片
File imageDir=new File("images");
File[] files=imageDir.listFiles();
for(File f:files)
{
try {
Image image=ImageIO.read(f);
display.addImage(image);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
main
package my;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MyDemo
{
private static void createGUI()
{
// JFrame指一个窗口,构造方法的参数为窗口标题
JFrame frame = new MyFrame("Js轮播图");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口的其他参数,如窗口大小
frame.setSize(1000, 700);
// 显示窗口
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
createGUI();
}
});
}
}