Java实现类Windows导航栏

                Java实现类Windows导航栏

在Windows系统中,通常都会有左侧导航栏以供选择,而Java架构下并没有给我们提供同样的组件,但是构建同样的东西实际上是很容易的。

 
package  org.loon.framework.swing.test;

import  java.awt.BorderLayout;
import  java.awt.Color;
import  java.awt.Component;
import  java.awt.Dimension;
import  java.awt.EventQueue;
import  java.awt.Font;
import  java.awt.GradientPaint;
import  java.awt.Graphics;
import  java.awt.Graphics2D;
import  java.awt.GridLayout;
import  java.awt.Insets;
import  java.awt.Rectangle;

import  java.awt.event.ComponentAdapter;
import  java.awt.event.ComponentEvent;
import  java.awt.event.MouseAdapter;
import  java.awt.event.MouseEvent;
import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;

import  javax.swing.BorderFactory;
import  javax.swing.ButtonGroup;
import  javax.swing.JCheckBox;
import  javax.swing.JComponent;
import  javax.swing.JFrame;
import  javax.swing.JLabel;
import  javax.swing.JPanel;
import  javax.swing.JRadioButton;
import  javax.swing.JScrollPane;
import  javax.swing.JSplitPane;
import  javax.swing.SpringLayout;
    import javax.swing.WindowConstants;
import javax.swing.border.Border;

/** *//**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */


public class ExampleAccordion extends JPanel ...{
    /** *//**
     * 
     */

    private static final long serialVersionUID = 1L;

    private final JPanel panel = new JPanel();

    private final JLabel label = new JLabel();

    // 分割窗体
    private final JSplitPane split = new JSplitPane();

    private final JScrollPane scroll;

    // 折叠效果
    public ExampleAccordion() ...{
        super(new BorderLayout());
        panel.setOpaque(true);
        panel.setBackground(new Color(116, 149, 226));
        // 滚动条
        scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scroll.getVerticalScrollBar().setUnitIncrement(10);
        scroll.getViewport().add(panel);

        // 构建数据列表
        List panelList = makeList();
        // 设定监听
        accordionListener exr = new accordionListener() ...{
            public void accordionStateChanged(accordionEvent e) ...{
                initComponent();
            }

        }
;
        for (Iterator it = panelList.iterator(); it.hasNext();) ...{
            AccordionPanel epl = (AccordionPanel) it.next();
            addComponent(epl);
            epl.addaccordionListener(exr);
        }

        // 加载滚动条监听
        scroll.getViewport().addComponentListener(new ComponentAdapter() ...{
            public void componentResized(ComponentEvent e) ...{
                initComponent();
            }

        }
);
        // 设定大小
        label.setPreferredSize(new Dimension(200, 260));

        scroll.setPreferredSize(new Dimension(200, 260));

        scroll.setMinimumSize(new Dimension(200, 260));

        split.setLeftComponent(scroll);
        split.setRightComponent(label);

        split.setDividerSize(1);
        split.setBackground(Color.WHITE);
        add(split, BorderLayout.CENTER);
    }


    public void initComponent() ...{
        Rectangle re = scroll.getViewport().getViewRect();
        Insets ins = panel.getInsets();
        int cw = (int) re.getWidth() - ins.left - ins.right - 20;
        int ch = 10;
        Component[] list = panel.getComponents();
        for (int i = 0; i < list.length; i++) ...{
            JComponent tmp = (JComponent) list[i];
            int th = tmp.getPreferredSize().height;
            tmp.setPreferredSize(new Dimension(cw, th));
            ch = ch + th + 10;
        }

        panel.setPreferredSize(new Dimension((int) re.getWidth(), ch + ins.top
                + ins.bottom));
        panel.revalidate();
    }


    public void addComponent(Component label) ...{
        SpringLayout layout = new SpringLayout();
        Component[] list = panel.getComponents();
        if (list.length == 0) ...{
            layout.putConstraint(SpringLayout.WEST, label, 10,
                    SpringLayout.WEST, panel);
            layout.putConstraint(SpringLayout.NORTH, label, 10,
                    SpringLayout.NORTH, panel);
        }
 else ...{
            JComponent cmp = null;
            for (int i = 0; i < list.length; i++) ...{
                JComponent tmp = (JComponent) list[i];
                layout.putConstraint(SpringLayout.WEST, tmp, 10,
                        SpringLayout.WEST, panel);
                if (cmp == null) ...{
                    layout.putConstraint(SpringLayout.NORTH, tmp, 10,
                            SpringLayout.NORTH, panel);
                }
 else ...{
                    layout.putConstraint(SpringLayout.NORTH, tmp, 10,
                            SpringLayout.SOUTH, cmp);
                }

                cmp = tmp;
            }

            layout.putConstraint(SpringLayout.WEST, label, 10,
                    SpringLayout.WEST, panel);
            layout.putConstraint(SpringLayout.NORTH, label, 10,
                    SpringLayout.SOUTH, cmp);
        }

        panel.add(label);
        panel.setLayout(layout);
        initComponent();
    }


    private List makeList() ...{
        List panelList = new ArrayList();
        panelList.add(new AccordionPanel("列表1") ...{
            /** *//**
             * 
             */

            private static final long serialVersionUID = 1L;

            public JPanel makePanel() ...{
                JPanel pnl = new JPanel(new GridLayout(0, 1));
                JCheckBox c1 = new JCheckBox("aaaaaa");
                JCheckBox c2 = new JCheckBox("bbbbbb");
                c1.setOpaque(false);
                c2.setOpaque(false);
                pnl.add(c1);
                pnl.add(c2);
                pnl.setSize(new Dimension(0, 60));
                pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
                return pnl;
            }

        }
);
        panelList.add(new AccordionPanel("列表2") ...{
            /** *//**
             * 
             */

            private static final long serialVersionUID = 1L;

            public JPanel makePanel() ...{
                JPanel pnl = new JPanel(new GridLayout(0, 1));
                pnl.add(new JLabel("辛苦遭逢起一经"));
                pnl.add(new JLabel("干戈寥落四周星"));
                pnl.add(new JLabel("山河破碎风飘絮"));
                pnl.add(new JLabel("身世浮沉雨打萍"));
                pnl.setSize(new Dimension(0, 100));
                pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
                return pnl;
            }

        }
);
        panelList.add(new AccordionPanel("列表3") ...{
            /** *//**
             * 
             */

            private static final long serialVersionUID = 1L;

            public JPanel makePanel() ...{
                JPanel pnl = new JPanel(new GridLayout(0, 1));
                JRadioButton b1 = new JRadioButton("aa");
                JRadioButton b2 = new JRadioButton("bb");
                JRadioButton b3 = new JRadioButton("cc");
                b1.setOpaque(false);
                b2.setOpaque(false);
                b3.setOpaque(false);
                pnl.add(b1);
                pnl.add(b2);
                pnl.add(b3);
                ButtonGroup bg = new ButtonGroup();
                bg.add(b1);
                bg.add(b2);
                bg.add(b3);
                b1.setSelected(true);
                pnl.setSize(new Dimension(0, 80));
                pnl.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
                return pnl;
            }

        }
);
        return panelList;
    }


    public static void main(String[] args) ...{
        EventQueue.invokeLater(new Runnable() ...{
            public void run() ...{
     &nbs

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值