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>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/


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

privatestaticfinallongserialVersionUID=1L;

privatefinalJPanelpanel=newJPanel();

privatefinalJLabellabel=newJLabel();

//分割窗体
privatefinalJSplitPanesplit=newJSplitPane();

privatefinalJScrollPanescroll;

//折叠效果
publicExampleAccordion()...{
super(newBorderLayout());
panel.setOpaque(
true);
panel.setBackground(
newColor(116,149,226));
//滚动条
scroll=newJScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.getVerticalScrollBar().setUnitIncrement(
10);
scroll.getViewport().add(panel);

//构建数据列表
ListpanelList=makeList();
//设定监听
accordionListenerexr=newaccordionListener()...{
publicvoidaccordionStateChanged(accordionEvente)...{
initComponent();
}

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

//加载滚动条监听
scroll.getViewport().addComponentListener(newComponentAdapter()...{
publicvoidcomponentResized(ComponentEvente)...{
initComponent();
}

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

scroll.setPreferredSize(
newDimension(200,260));

scroll.setMinimumSize(
newDimension(200,260));

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

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


publicvoidinitComponent()...{
Rectanglere
=scroll.getViewport().getViewRect();
Insetsins
=panel.getInsets();
intcw=(int)re.getWidth()-ins.left-ins.right-20;
intch=10;
Component[]list
=panel.getComponents();
for(inti=0;i<list.length;i++)...{
JComponenttmp
=(JComponent)list[i];
intth=tmp.getPreferredSize().height;
tmp.setPreferredSize(
newDimension(cw,th));
ch
=ch+th+10;
}

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


publicvoidaddComponent(Componentlabel)...{
SpringLayoutlayout
=newSpringLayout();
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...{
JComponentcmp
=null;
for(inti=0;i<list.length;i++)...{
JComponenttmp
=(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();
}


privateListmakeList()...{
ListpanelList
=newArrayList();
panelList.add(
newAccordionPanel("列表1")...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

publicJPanelmakePanel()...{
JPanelpnl
=newJPanel(newGridLayout(0,1));
JCheckBoxc1
=newJCheckBox("aaaaaa");
JCheckBoxc2
=newJCheckBox("bbbbbb");
c1.setOpaque(
false);
c2.setOpaque(
false);
pnl.add(c1);
pnl.add(c2);
pnl.setSize(
newDimension(0,60));
pnl.setBorder(BorderFactory.createEmptyBorder(
5,15,5,15));
returnpnl;
}

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

privatestaticfinallongserialVersionUID=1L;

publicJPanelmakePanel()...{
JPanelpnl
=newJPanel(newGridLayout(0,1));
pnl.add(
newJLabel("辛苦遭逢起一经"));
pnl.add(
newJLabel("干戈寥落四周星"));
pnl.add(
newJLabel("山河破碎风飘絮"));
pnl.add(
newJLabel("身世浮沉雨打萍"));
pnl.setSize(
newDimension(0,100));
pnl.setBorder(BorderFactory.createEmptyBorder(
5,15,5,15));
returnpnl;
}

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

privatestaticfinallongserialVersionUID=1L;

publicJPanelmakePanel()...{
JPanelpnl
=newJPanel(newGridLayout(0,1));
JRadioButtonb1
=newJRadioButton("aa");
JRadioButtonb2
=newJRadioButton("bb");
JRadioButtonb3
=newJRadioButton("cc");
b1.setOpaque(
false);
b2.setOpaque(
false);
b3.setOpaque(
false);
pnl.add(b1);
pnl.add(b2);
pnl.add(b3);
ButtonGroupbg
=newButtonGroup();
bg.add(b1);
bg.add(b2);
bg.add(b3);
b1.setSelected(
true);
pnl.setSize(
newDimension(0,80));
pnl.setBorder(BorderFactory.createEmptyBorder(
5,15,5,15));
returnpnl;
}

}
);
returnpanelList;
}


publicstaticvoidmain(String[]args)...{
EventQueue.invokeLater(
newRunnable()...{
publicvoidrun()...{
createUI();
}

}
);
}


publicstaticvoidcreateUI()...{
JFrameframe
=newJFrame("JAVA实现类Windows导航栏");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(
newExampleAccordion());
frame.pack();
frame.setLocationRelativeTo(
null);
frame.setVisible(
true);
}

}


class accordionEvent extends java.util.EventObject ... {
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

publicaccordionEvent(Objectsource)...{
super(source);
}

}


interface accordionListener ... {
publicvoidaccordionStateChanged(accordionEvente);
}


abstract class AccordionPanel extends JPanel ... {
abstractpublicJPanelmakePanel();

privatefinalString_title;

privatefinalJLabellabel;

privatefinalJPanelpanel;

privatebooleanopenFlag=false;

publicAccordionPanel(Stringtitle)...{
super(newBorderLayout());
_title
=title;
label
=newJLabel(""+title)...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

protectedvoidpaintComponent(Graphicsg)...{
Graphics2Dg2
=(Graphics2D)g;
//绘制渐变
g2.setPaint(newGradientPaint(50,0,Color.WHITE,getWidth(),
getHeight(),
newColor(199,212,247)));
g2.fillRect(
0,0,getWidth(),getHeight());
super.paintComponent(g);
}

}
;
label.addMouseListener(
newMouseAdapter()...{
publicvoidmousePressed(MouseEventevt)...{
openFlag
=!openFlag;
initPanel();
fireaccordionEvent();
}

}
);
label.setForeground(
newColor(33,93,198));
label.setFont(
newFont("宋体",1,12));
label.setBorder(BorderFactory.createEmptyBorder(
2,5,2,2));
panel
=makePanel();
panel.setOpaque(
true);
BorderoutBorder
=BorderFactory.createMatteBorder(0,2,2,2,
Color.WHITE);
BorderinBorder
=BorderFactory.createEmptyBorder(10,10,10,10);
Borderborder
=BorderFactory.createCompoundBorder(outBorder,inBorder);
panel.setBorder(border);
panel.setBackground(
newColor(240,240,255));
add(label,BorderLayout.NORTH);
}


publicbooleanisSelected()...{
returnopenFlag;
}


publicvoidsetSelected(booleanflg)...{
openFlag
=flg;
initPanel();
}


protectedvoidinitPanel()...{
if(isSelected())...{
label.setText(
""+_title);
add(panel,BorderLayout.CENTER);
setPreferredSize(
newDimension(getSize().width,
label.getSize().height
+panel.getSize().height));
}
else...{
label.setText(
""+_title);
remove(panel);
setPreferredSize(
newDimension(getSize().width,
label.getSize().height));
}

revalidate();
}


protectedArrayListaccordionListenerList=newArrayList();

publicvoidaddaccordionListener(accordionListenerlistener)...{
if(!accordionListenerList.contains(listener))
accordionListenerList.add(listener);
}


publicvoidremoveaccordionListener(accordionListenerlistener)...{
accordionListenerList.remove(listener);
}


publicvoidfireaccordionEvent()...{
Listlist
=(List)accordionListenerList.clone();
Iteratorit
=list.iterator();
accordionEvente
=newaccordionEvent(this);
while(it.hasNext())...{
accordionListenerlistener
=(accordionListener)it.next();
listener.accordionStateChanged(e);
}

}

}



效果图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值