Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 500|回复: 0

[Swing学习]Java实现的类似Windows导航栏

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-11 23:57:09 | 显示全部楼层 |阅读模式
    在Windows系统中,通常都会有左侧导航栏以供选择,而java架构下并没有给我们提供同样的组件,但是构建同样的东西实际上是很容易的。

    1. import java.awt.BorderLayout;
    2. import java.awt.Color;
    3. import java.awt.Component;
    4. import java.awt.Dimension;
    5. import java.awt.EventQueue;
    6. import java.awt.Font;
    7. import java.awt.GradientPaint;
    8. import java.awt.Graphics;
    9. import java.awt.Graphics2D;
    10. import java.awt.GridLayout;
    11. import java.awt.Insets;
    12. import java.awt.Rectangle;
    13. import java.awt.event.ComponentAdapter;
    14. import java.awt.event.ComponentEvent;
    15. import java.awt.event.MouseAdapter;
    16. import java.awt.event.MouseEvent;
    17. import java.util.ArrayList;
    18. import java.util.Iterator;
    19. import java.util.List;
    20. import javax.swing.BorderFactory;
    21. import javax.swing.ButtonGroup;
    22. import javax.swing.JCheckBox;
    23. import javax.swing.JComponent;
    24. import javax.swing.JFrame;
    25. import javax.swing.JLabel;
    26. import javax.swing.JPanel;
    27. import javax.swing.JRadioButton;
    28. import javax.swing.JScrollPane;
    29. import javax.swing.JSplitPane;
    30. import javax.swing.SpringLayout;
    31. import javax.swing.WindowConstants;
    32. import javax.swing.border.Border;
    33. /** *//**
    34. *
    35. * Title: LoonFramework
    36. *
    37. *
    38. * Description:
    39. * Copyright: Copyright (c) 2007
    40. *
    41. *
    42. * Company: LoonFramework
    43. *
    44. * @author chenpeng
    45. * @email:ceponline@yahoo.com.cn
    46. * @version 0.1
    47. */
    48. public class ExampleAccordion extends JPanel {
    49.     /** *//**
    50.      *
    51.      */
    52.     private static final long serialVersionUID = 1L;
    53.     private final JPanel panel = new JPanel();
    54.     private final JLabel label = new JLabel();
    55.     // 分割窗体
    56.     private final JSplitPane split = new JSplitPane();
    57.     private final JScrollPane scroll;
    58.     // 折叠效果
    59.     public ExampleAccordion() {
    60.         super(new BorderLayout());
    61.         panel.setOpaque(true);
    62.         panel.setBackground(new Color(116, 149, 226));
    63.         // 滚动条
    64.         scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    65.                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    66.         scroll.getVerticalScrollBar().setUnitIncrement(10);
    67.         scroll.getViewport().add(panel);
    68.         // 构建数据列表
    69.         List panelList = makeList();
    70.         // 设定监听
    71.         accordionListener exr = new accordionListener() {
    72.             public void accordionStateChanged(accordionEvent e) {
    73.                 initComponent();
    74.             }
    75.         };
    76.         for (Iterator it = panelList.iterator(); it.hasNext();) {
    77.             AccordionPanel epl = (AccordionPanel) it.next();
    78.             addComponent(epl);
    79.             epl.addaccordionListener(exr);
    80.         }
    81.         // 加载滚动条监听
    82.         scroll.getViewport().addComponentListener(new ComponentAdapter() {
    83.             public void componentResized(ComponentEvent e) {
    84.                 initComponent();
    85.             }
    86.         });
    87.         // 设定大小
    88.         label.setPreferredSize(new Dimension(200, 260));
    89.         scroll.setPreferredSize(new Dimension(200, 260));
    90.         scroll.setMinimumSize(new Dimension(200, 260));
    91.         split.setLeftComponent(scroll);
    92.         split.setRightComponent(label);
    93.         split.setDividerSize(1);
    94.         split.setBackground(Color.WHITE);
    95.         add(split, BorderLayout.CENTER);
    96.     }
    97.     public void initComponent() {
    98.         Rectangle re = scroll.getViewport().getViewRect();
    99.         Insets ins = panel.getInsets();
    100.         int cw = (int) re.getWidth() - ins.left - ins.right - 20;
    101.         int ch = 10;
    102.         Component[] list = panel.getComponents();
    103.         for (int i = 0; i < list.length; i++) {
    104.             JComponent tmp = (JComponent) list[i];
    105.             int th = tmp.getPreferredSize().height;
    106.             tmp.setPreferredSize(new Dimension(cw, th));
    107.             ch = ch + th + 10;
    108.         }
    109.         panel.setPreferredSize(new Dimension((int) re.getWidth(), ch + ins.top
    110.                 + ins.bottom));
    111.         panel.revalidate();
    112.     }
    113.     public void addComponent(Component label) {
    114.         SpringLayout layout = new SpringLayout();
    115.         Component[] list = panel.getComponents();
    116.         if (list.length == 0) {
    117.             layout.putConstraint(SpringLayout.WEST, label, 10,
    118.                     SpringLayout.WEST, panel);
    119.             layout.putConstraint(SpringLayout.NORTH, label, 10,
    120.                     SpringLayout.NORTH, panel);
    121.         } else {
    122.             JComponent cmp = null;
    123.             for (int i = 0; i < list.length; i++) {
    124.                 JComponent tmp = (JComponent) list[i];
    125.                 layout.putConstraint(SpringLayout.WEST, tmp, 10,
    126.                         SpringLayout.WEST, panel);
    127.                 if (cmp == null) {
    128.                     layout.putConstraint(SpringLayout.NORTH, tmp, 10,
    129.                             SpringLayout.NORTH, panel);
    130.                 } else {
    131.                     layout.putConstraint(SpringLayout.NORTH, tmp, 10,
    132.                             SpringLayout.SOUTH, cmp);
    133.                 }
    134.                 cmp = tmp;
    135.             }
    136.             layout.putConstraint(SpringLayout.WEST, label, 10,
    137.                     SpringLayout.WEST, panel);
    138.             layout.putConstraint(SpringLayout.NORTH, label, 10,
    139.                     SpringLayout.SOUTH, cmp);
    140.         }
    141.         panel.add(label);
    142.         panel.setLayout(layout);
    143.         initComponent();
    144.     }
    145.     private List makeList() {
    146.         List panelList = new ArrayList();
    147.         panelList.add(new AccordionPanel("列表1") {
    148.             /** *//**
    149.              *
    150.              */
    151.             private static final long serialVersionUID = 1L;
    152.             public JPanel makePanel() {
    153.                 JPanel pnl = new JPanel(new GridLayout(0, 1));
    154.                 JCheckBox c1 = new JCheckBox("aaaaaa");
    155.                 JCheckBox c2 = new JCheckBox("bbbbbb");
    156.                 c1.setOpaque(false);
    157.                 c2.setOpaque(false);
    158.                 pnl.add(c1);
    159.                 pnl.add(c2);
    160.                 pnl.setSize(new Dimension(0, 60));
    161.                 pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    162.                 return pnl;
    163.             }
    164.         });
    165.         panelList.add(new AccordionPanel("列表2") {
    166.             /** *//**
    167.              *
    168.              */
    169.             private static final long serialVersionUID = 1L;
    170.             public JPanel makePanel() {
    171.                 JPanel pnl = new JPanel(new GridLayout(0, 1));
    172.                 pnl.add(new JLabel("辛苦遭逢起一经"));
    173.                 pnl.add(new JLabel("干戈寥落四周星"));
    174.                 pnl.add(new JLabel("山河破碎风飘絮"));
    175.                 pnl.add(new JLabel("身世浮沉雨打萍"));
    176.                 pnl.setSize(new Dimension(0, 100));
    177.                 pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    178.                 return pnl;
    179.             }
    180.         });
    181.         panelList.add(new AccordionPanel("列表3") {
    182.             /** *//**
    183.              *
    184.              */
    185.             private static final long serialVersionUID = 1L;
    186.             public JPanel makePanel() {
    187.                 JPanel pnl = new JPanel(new GridLayout(0, 1));
    188.                 JRadioButton b1 = new JRadioButton("aa");
    189.                 JRadioButton b2 = new JRadioButton("bb");
    190.                 JRadioButton b3 = new JRadioButton("cc");
    191.                 b1.setOpaque(false);
    192.                 b2.setOpaque(false);
    193.                 b3.setOpaque(false);
    194.                 pnl.add(b1);
    195.                 pnl.add(b2);
    196.                 pnl.add(b3);
    197.                 ButtonGroup bg = new ButtonGroup();
    198.                 bg.add(b1);
    199.                 bg.add(b2);
    200.                 bg.add(b3);
    201.                 b1.setSelected(true);
    202.                 pnl.setSize(new Dimension(0, 80));
    203.                 pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    204.                 return pnl;
    205.             }
    206.         });
    207.         return panelList;
    208.     }
    209.     public static void main(String[] args) {
    210.         EventQueue.invokeLater(new Runnable() {
    211.             public void run() {
    212.                 createUI();
    213.             }
    214.         });
    215.     }
    216.     public static void createUI() {
    217.         JFrame frame = new JFrame("JAVA实现类Windows导航栏");
    218.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    219.         frame.getContentPane().add(new ExampleAccordion());
    220.         frame.pack();
    221.         frame.setLocationRelativeTo(null);
    222.         frame.setVisible(true);
    223.     }
    224. }
    225. class accordionEvent extends java.util.EventObject {
    226.     /** *//**
    227.      *
    228.      */
    229.     private static final long serialVersionUID = 1L;
    230.     public accordionEvent(Object source) {
    231.         super(source);
    232.     }
    233. }
    234. interface accordionListener {
    235.     public void accordionStateChanged(accordionEvent e);
    236. }
    237. abstract class AccordionPanel extends JPanel {
    238.     abstract public JPanel makePanel();
    239.     private final String _title;
    240.     private final JLabel label;
    241.     private final JPanel panel;
    242.     private boolean openFlag = false;
    243.     public AccordionPanel(String title) {
    244.         super(new BorderLayout());
    245.         _title = title;
    246.         label = new JLabel("↓ " + title) {
    247.             /** *//**
    248.              *
    249.              */
    250.             private static final long serialVersionUID = 1L;
    251.             protected void paintComponent(Graphics g) {
    252.                 Graphics2D g2 = (Graphics2D) g;
    253.                 // 绘制渐变
    254.                 g2.setPaint(new GradientPaint(50, 0, Color.WHITE, getWidth(),
    255.                         getHeight(), new Color(199, 212, 247)));
    256.                 g2.fillRect(0, 0, getWidth(), getHeight());
    257.                 super.paintComponent(g);
    258.             }
    259.         };
    260.         label.addMouseListener(new MouseAdapter() {
    261.             public void mousePressed(MouseEvent evt) {
    262.                 openFlag = !openFlag;
    263.                 initPanel();
    264.                 fireaccordionEvent();
    265.             }
    266.         });
    267.         label.setForeground(new Color(33, 93, 198));
    268.         label.setFont(new Font("宋体", 1, 12));
    269.         label.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 2));
    270.         panel = makePanel();
    271.         panel.setOpaque(true);
    272.         Border outBorder = BorderFactory.createMatteBorder(0, 2, 2, 2,
    273.                 Color.WHITE);
    274.         Border inBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
    275.         Border border = BorderFactory.createCompoundBorder(outBorder, inBorder);
    276.         panel.setBorder(border);
    277.         panel.setBackground(new Color(240, 240, 255));
    278.         add(label, BorderLayout.NORTH);
    279.     }
    280.     public boolean isSelected() {
    281.         return openFlag;
    282.     }
    283.     public void setSelected(boolean flg) {
    284.         openFlag = flg;
    285.         initPanel();
    286.     }
    287.     protected void initPanel() {
    288.         if (isSelected()) {
    289.             label.setText("↑ " + _title);
    290.             add(panel, BorderLayout.CENTER);
    291.             setPreferredSize(new Dimension(getSize().width,
    292.                     label.getSize().height + panel.getSize().height));
    293.         } else {
    294.             label.setText("↓ " + _title);
    295.             remove(panel);
    296.             setPreferredSize(new Dimension(getSize().width,
    297.                     label.getSize().height));
    298.         }
    299.         revalidate();
    300.     }
    301.     protected ArrayList accordionListenerList = new ArrayList();
    302.     public void addaccordionListener(accordionListener listener) {
    303.         if (!accordionListenerList.contains(listener))
    304.             accordionListenerList.add(listener);
    305.     }
    306.     public void removeaccordionListener(accordionListener listener) {
    307.         accordionListenerList.remove(listener);
    308.     }
    309.     public void fireaccordionEvent() {
    310.         List list = (List) accordionListenerList.clone();
    311.         Iterator it = list.iterator();
    312.         accordionEvent e = new accordionEvent(this);
    313.         while (it.hasNext()) {
    314.             accordionListener listener = (accordionListener) it.next();
    315.             listener.accordionStateChanged(e);
    316.         }
    317.     }
    318. }
    复制代码

      
       
       
         
       

         
       
      
       

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/11/235709250.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:38 , Processed in 0.289446 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表