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