Java-轮播图

 设计思路:

 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();
			}
		});
 
	}
}

 

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于Java Swing轮播图的实现,您可以参考以下步骤: 1. 首先,您需要导入Java Swing相关的包。您可以使用以下代码来导入Swing包: ``` import javax.swing.*; ``` 2. 创建一个JFrame窗口作为轮播图的容器。您可以使用以下代码创建一个JFrame对象: ``` JFrame frame = new JFrame("轮播图"); ``` 3. 设置轮播图的布局管理器为CardLayout。CardLayout可以实现多个组件的切换显示,非常适合轮播图的效果。您可以使用以下代码来设置布局管理器: ``` CardLayout cardLayout = new CardLayout(); frame.setLayout(cardLayout); ``` 4. 创建多个轮播图的面板。每个面板都可以包含一张图片或其他内容。您可以使用以下代码创建一个面板: ``` JPanel panel1 = new JPanel(); ``` 5. 在每个面板上添加需要显示的内容,例如图片、文本等。您可以使用以下代码来添加图片: ``` ImageIcon image1 = new ImageIcon("image1.jpg"); JLabel label1 = new JLabel(image1); panel1.add(label1); ``` 6. 将所有的面板添加到JFrame容器中。您可以使用以下代码将面板添加到容器中: ``` frame.add(panel1, "panel1"); ``` 7. 设置定时器,用于定时切换轮播图的显示。您可以使用以下代码来创建定时器,并在每次触发时切换面板的显示: ``` Timer timer = new Timer(3000, new ActionListener() { int index = 1; public void actionPerformed(ActionEvent e) { cardLayout.show(frame.getContentPane(), "panel" + index); index = (index % numPanels) + 1; } }); timer.start(); ``` 在这里,您可以根据实际情况调整定时器的触发间隔,以及面板的数量。 8. 最后,设置JFrame窗口的大小、可见性和关闭操作。您可以使用以下代码完成设置: ``` frame.setSize(500, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); ``` 通过以上步骤,您可以实现一个简单的Java Swing轮播图。请根据您的实际需求和具体情况进行适当调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值