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

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

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

importjavax.swing.BorderFactory;
importjavax.swing.ButtonGroup;
importjavax.swing.JCheckBox;
importjavax.swing.JComponent;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JRadioButton;
importjavax.swing.JScrollPane;
importjavax.swing.JSplitPane;
importjavax.swing.SpringLayout;
importjavax.swing.WindowConstants;
importjavax.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
*/


publicclassExampleAccordionextendsJPanel...{

/***//**
*
*/
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);
}
}


classaccordionEventextendsjava.util.EventObject...{

/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;


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


interfaceaccordionListener...{
publicvoidaccordionStateChanged(accordionEvente);
}


abstractclassAccordionPanelextendsJPanel...{
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);
}
}
}
效果图:
在Windows系统中,通常都会有左侧导航栏以供选择,而Java架构下并没有给我们提供同样的组件,但是构建同样的东西实际上是很容易的。


































importjavax.swing.WindowConstants;



























































































































































































































































































































































































效果图:
