仿照未必是一件坏事,先要学会仿照,接着理解他,吃透他,等你懂了一定原理后,发现以前的东西不怎么够好,需要改进,那么通过你的改进,使你的软件用户体验更好,我想这应该就是微创新吧。
这个例子的源码是CSDN的一位开发者所分享且一直珍藏在我的浏览器收藏夹多年,由于历史原因现在CSDN已经找不到原文。本着开源分享互助的精神我将源码完善再次公布如下:
package com.github.xuchengen.windows; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 仿网页分页 * 作者:徐承恩 * 邮箱:xuchengen@gmail.com * 日期:2019/10/30 */ public class Pagination extends JFrame { /** * 总的页码数 */ private int pageTotal = 35; /** * 当前页 */ private int currentPage = 1; /** * 存放一系列页码按钮,默认流布局 */ private JPanel pageBtns = new JPanel(); /** * 无参数构造方法 */ private Pagination() { //设置窗口标题 this.setTitle("仿网页分页By徐承恩"); //设置JFrame的布局 this.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20)); //设置窗口可拉伸 this.setResizable(true); //档点击叉叉时,窗口可关闭 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //默认显示第一页 ,设置页码布局 setPageBottom(currentPage); //自适应子控件宽和高度度来调整窗口大小 this.pack(); //窗口居中 this.setLocationRelativeTo(null); //窗口可见 this.setVisible(true); } /** * 设置页码按钮 * * @param currentPage 当前页码 */ private void setPageBottom(int currentPage) { pageBtns.removeAll(); if (currentPage <= 0 || currentPage > pageTotal) { return; } //这个是显示数字按钮的总个数,不包括首页 尾页等其他按钮 int countNumBtn = 9; // 首页 1 2 3 4 5 6 7 8 9 尾页 int half = countNumBtn / 2; int startNum = 0; int endNum = 0; JButton btnFistPage = new JButton("首页"); btnFistPage.setActionCommand("首页"); btnFistPage.setToolTipText("首页"); btnFistPage.setToolTipText("首页"); btnFistPage.addActionListener(new BottomPageButtonAction()); JButton btnLastPage = new JButton("末页"); btnLastPage.setActionCommand("末页"); btnLastPage.addActionListener(new BottomPageButtonAction()); btnLastPage.setToolTipText("共" + pageTotal + "页"); Container con = this.getContentPane(); con.invalidate(); pageBtns.add(btnFistPage); if (currentPage != 1) { JButton btnPrePage = new JButton("上一页"); btnPrePage.setActionCommand("上一页"); btnPrePage.setToolTipText("上一页是第" + (Math.max(currentPage - 1, 1)) + "页"); btnPrePage.addActionListener(new BottomPageButtonAction()); pageBtns.add(btnPrePage); } // 下面开始计算从左至右数字键(JButton)上的text int minBtnNum = currentPage - half; int maxBtnNum = currentPage + half; if (minBtnNum > 0 && maxBtnNum <= pageTotal) { startNum = minBtnNum; endNum = maxBtnNum; } else if (minBtnNum <= 0) { startNum = 1; endNum = Math.min(countNumBtn, pageTotal); } else { startNum = pageTotal > countNumBtn ? pageTotal - (countNumBtn - 1) : 1; endNum = pageTotal; } for (int i = startNum; i <= endNum; i++) { JButton btn = new JButton(); btn.addActionListener(new BottomPageButtonAction(i)); btn.setActionCommand("数字"); btn.setToolTipText("第" + i + "页"); btn.setText(i + ""); if (i == currentPage) { btn.setBackground(Color.red); } else { btn.setBackground(Color.white); } pageBtns.add(btn); } if (currentPage != pageTotal) { JButton btnNextPage = new JButton("下一页"); btnNextPage.setActionCommand("下一页"); btnNextPage.setToolTipText("下一页是第" + (Math.min(currentPage + 1, pageTotal)) + "页"); btnNextPage.addActionListener(new BottomPageButtonAction()); pageBtns.add(btnNextPage); } pageBtns.add(btnLastPage); con.validate(); this.add(pageBtns); } //页码事件处理 class BottomPageButtonAction implements ActionListener { int btnNumText = 0; BottomPageButtonAction() { } BottomPageButtonAction(int num) { btnNumText = num; } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); System.out.println(command); switch (command) { case "首页": // setPageBottom(1); // 首页就是第一页,所以直接传个1 currentPage = 1; break; case "上一页": setPageBottom(currentPage - 1 >= 1 ? --currentPage : 1); break; case "下一页": setPageBottom(currentPage + 1 <= pageTotal ? ++currentPage : pageTotal); break; case "末页": setPageBottom(pageTotal); // 末页是最后的页数 currentPage = pageTotal; break; case "数字": setPageBottom(btnNumText); currentPage = btnNumText; break; } //自适应子控件宽和高度度来调整窗口大小 pack(); System.out.println("当前是第 " + currentPage + "页"); } } public static void main(String[] args) { new Pagination(); } }