Professional Documents
Culture Documents
Swinghasplentyoflayoutmanagersavailablebothbuiltinandthirdparty.However,mostofthe
managersarenotsuitableinmodernUIcreation.
Therearethreelayoutmanagersthatcandothejobproperly:
MigLayout
GroupLayout
FormLayout
MigLayout,GroupLayout,andFormLayoutarepowerful,flexiblelayoutmanagersthatcancopewith
mostlayoutrequirements.
Thefollowinglayoutmanagersareobsolete:
FlowLayout
GridLayout
CardLayout
BoxLayout
GridBagLayout
TheselayoutmanagersaresimplisticandtheycannotfulfillrequirementsforamodernUI.
Obsoletemanagers
Inthissection,wearegoingtocoverobsoletelayoutmanagers.Thesemanagersarenotrecommended
touse.Onlyputsometimetostudythemifweneedtomaintainsomelegacycode.Otherwise,their
usageshouldberejected.
FlowLayoutmanager
ThisisthesimplestlayoutmanagerintheJavaSwingtoolkit.Itisthedefaultlayoutmanagerfor
theJPanelcomponent.
Itissosimplethatitcannotbeusedforanyreallayout.ThismanageriscoveredinmanyJavaSwing
tutorialsandtherefore,beginnerstrytouseitintheirprojectsnotrealizingthatitcannotbeusedfor
anythingserious.
Whencalculatingitschildrensize,aflowlayoutletseachcomponentassumeitsnatural(preferred)
size.Themanagerputscomponentsintoarow.Intheorder,theywereadded.Iftheydonotfitinto
onerow,theygointothenextone.Thecomponentscanbeaddedfromtherighttotheleftorvice
versa.Themanagerallowstoalignthecomponents.Implicitly,thecomponentsarecenteredandthere
is5pxspaceamongcomponentsandcomponentsandtheedgesofthecontainer.
FlowLayout()
FlowLayout(intalign)
FlowLayout(intalign,inthgap,intvgap)
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 1/23
3/25/2017 TheSwinglayoutmanagement
TherearethreeconstructorsavailablefortheFlowLayoutmanager.Thefirstonecreatesamanager
withimplicitvalues.Centeredwith5pxhorizontalandverticalspaces.Theothersallowtospecify
thoseparameters.
FlowLayoutEx.java
packagecom.zetcode;
importjava.awt.Dimension;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.JTree;
importjavax.swing.SwingUtilities;
publicclassFlowLayoutExextendsJFrame{
publicFlowLayoutEx(){
initUI();
}
privatevoidinitUI(){
JPanelpanel=newJPanel();
JButtonbutton=newJButton("button");
panel.add(button);
JTreetree=newJTree();
panel.add(tree);
JTextAreaarea=newJTextArea("textarea");
area.setPreferredSize(newDimension(100,100));
panel.add(area);
add(panel);
pack();
setTitle("FlowLayoutExample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
FlowLayoutExex=newFlowLayoutEx();
ex.setVisible(true);
});
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 2/23
3/25/2017 TheSwinglayoutmanagement
}
}
Theexampleshowsabutton,atreecomponent,andatextareacomponentinthewindow.Ifwecreate
anemptytreecomponent,therearesomedefaultvaluesinsidethecomponent.
JPanelpanel=newJPanel();
TheimplicitlayoutmanageroftheJPanelcomponentisaflowlayoutmanager.Wedonothavetoset
itmanually.
JTextAreaarea=newJTextArea("textarea");
area.setPreferredSize(newDimension(100,100));
Theflowlayoutmanagersetsapreferredsizeforitscomponents.Thismeans,thatinourcase,the
areacomponentwillhave100x100px.Ifwedidn'tsetthepreferredsize,thecomponentwouldhavea
sizeofitstext.Nomore,noless.Withoutthetext,thecomponentwouldnotbevisibleatall.Tryto
writeordeletesometextintheareacomponent.Thecomponentwillgrowandshrinkaccordingly.
panel.add(area);
Toputacomponentinsideacontainer,wesimplycalltheadd()method.
Figure:FlowLayout
GridLayout
TheGridLayoutlayoutmanagerlaysoutcomponentsinarectangulargrid.Thecontainerisdivided
intoequallysizedrectangles.Onecomponentisplacedineachrectangle.
GridLayoutisverysimpleandcannotbeusedforanyreallayout.
GridLayoutEx.java
packagecom.zetcode;
importjava.awt.GridLayout;
importjavax.swing.BorderFactory;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 3/23
3/25/2017 TheSwinglayoutmanagement
importjavax.swing.SwingUtilities;
publicclassGridLayoutExextendsJFrame{
publicGridLayoutEx(){
initUI();
}
privatevoidinitUI(){
JPanelpanel=newJPanel();
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
panel.setLayout(newGridLayout(5,4,5,5));
String[]buttons={
"Cls","Bck","","Close","7","8","9","/","4",
"5","6","*","1","2","3","","0",".","=","+"
};
for(inti=0;i<buttons.length;i++){
if(i==2){
panel.add(newJLabel(buttons[i]));
}else{
panel.add(newJButton(buttons[i]));
}
}
add(panel);
setTitle("GridLayout");
setSize(350,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
GridLayoutExex=newGridLayoutEx();
ex.setVisible(true);
});
}
}
Theexampleshowsaskeletonofasimplecalculatortool.Weputnineteenbuttonsandonelabelinto
themanager.Noticethateachbuttonisofthesamesize.
panel.setLayout(newGridLayout(5,4,5,5));
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 4/23
3/25/2017 TheSwinglayoutmanagement
Herewesetthegridlayoutmanagerforthepanelcomponent.Thelayoutmanagertakesfour
parameters.Thenumberofrows,thenumberofcolumnsandthehorizontalandverticalgapsbetween
components.
Figure:GridLayout
BorderLayout
BorderLayoutisasimplelayoutmanagerthatcanbehandyincertainlayouts.Itisadefaultlayout
managerforJFrame,JWindow,JDialog,JInternalFrame,andJApplet.Ithasaseriouslimitiation
itsetsthegapsbetweenitschildreninpixels,thuscreatingrigidlayouts.Thisleadstononportable
UI,andtherefore,itsusageisnotrecommended.
BorderLayoutdividesthespaceintofiveregions:north,west,south,east,andcentre.Eachregion
canhaveonlyonecomponent.Ifweneedtoputmorecomponentsintoaregion,wehavetoputa
paneltherewithamanagerofourchoice.ThecomponentsinN,W,S,Eregionsget
theirpreferredsize.Thecomponentinthecentretakesupthewholespaceleft.
Itdoesnotlookgoodifchildcomponentsaretooclosetoeachother.Wemustputsomespaceamong
them.EachcomponentinSwingtoolkitcanhavebordersarounditsedges.Tocreateaborder,we
eithercreateanewinstanceofanEmptyBorderclassorweuseaBorderFactory.
BorderEx.java
packagecom.zetcode;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Insets;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.SwingUtilities;
importjavax.swing.border.EmptyBorder;
publicclassBorderExextendsJFrame{
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 5/23
3/25/2017 TheSwinglayoutmanagement
publicBorderEx(){
initUI();
}
privatevoidinitUI(){
JPanelbottomPanel=newJPanel(newBorderLayout());
JPaneltopPanel=newJPanel();
topPanel.setBackground(Color.gray);
topPanel.setPreferredSize(newDimension(250,150));
bottomPanel.add(topPanel);
bottomPanel.setBorder(newEmptyBorder(newInsets(20,20,20,20)));
add(bottomPanel);
pack();
setTitle("BorderExample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
BorderExex=newBorderEx();
ex.setVisible(true);
});
}
}
Theexamplewilldisplayagraypanelandborderaroundit.
JPanelbottomPanel=newJPanel(newBorderLayout());
JPaneltopPanel=newJPanel();
Weplaceapanelintoapanel.ThebottompanelhasaBorderLayoutmanager.
bottomPanel.add(topPanel);
Hereweplacedthetoppanelintothebottompanelcomponent.Moreprecisely,weplaceditintothe
centerareaofitsBorderLayoutmanager.
bottomPanel.setBorder(newEmptyBorder(newInsets(20,20,20,20)));
Herewecreateda20pxborderaroundthebottompanel.Thebordervaluesareasfollows:top,left,
bottomandright.Notethatcreatingfixedinsets(spaces)isnotportable.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 6/23
3/25/2017 TheSwinglayoutmanagement
Figure:Borderexample
Thenextexamplewillshowatypicalusageofaborderlayoutmanager.
BorderLayoutEx.java
packagecom.zetcode;
importjava.awt.BorderLayout;
importjava.awt.Insets;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JTextArea;
importjavax.swing.JToolBar;
importjavax.swing.SwingUtilities;
importjavax.swing.border.EmptyBorder;
publicclassBorderLayoutExextendsJFrame{
publicBorderLayoutEx(){
initUI();
}
privatevoidinitUI(){
JMenuBarmenubar=newJMenuBar();
JMenufile=newJMenu("File");
menubar.add(file);
setJMenuBar(menubar);
JToolBartoolbar=newJToolBar();
toolbar.setFloatable(false);
ImageIconexit=newImageIcon("exit.png");
JButtonbexit=newJButton(exit);
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 7/23
3/25/2017 TheSwinglayoutmanagement
bexit.setBorder(newEmptyBorder(0,0,0,0));
toolbar.add(bexit);
add(toolbar,BorderLayout.NORTH);
JToolBarvertical=newJToolBar(JToolBar.VERTICAL);
vertical.setFloatable(false);
vertical.setMargin(newInsets(10,5,5,5));
ImageIcondriveIcon=newImageIcon("drive.png");
ImageIconcompIcon=newImageIcon("computer.png");
ImageIconprintIcon=newImageIcon("printer.png");
JButtondriveBtn=newJButton(driveIcon);
driveBtn.setBorder(newEmptyBorder(3,0,3,0));
JButtoncompBtn=newJButton(compIcon);
compBtn.setBorder(newEmptyBorder(3,0,3,0));
JButtonprintBtn=newJButton(printIcon);
printBtn.setBorder(newEmptyBorder(3,0,3,0));
vertical.add(driveBtn);
vertical.add(compBtn);
vertical.add(printBtn);
add(vertical,BorderLayout.WEST);
add(newJTextArea(),BorderLayout.CENTER);
JLabelstatusbar=newJLabel("Statusbar");
add(statusbar,BorderLayout.SOUTH);
setSize(400,350);
setTitle("BorderLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
BorderLayoutExex=newBorderLayoutEx();
ex.setVisible(true);
});
}
}
Theexampleshowsatypicalapplicationskeleton.Weshowaverticalandhorizontaltoolbars,a
statusbar,andacentralcomponent(atextarea).
BorderLayoutisthedefaultlayoutmanagerfortheJFramecontainer.Sowedonothavetosetit
explicitly.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 8/23
3/25/2017 TheSwinglayoutmanagement
add(toolbar,BorderLayout.NORTH);
Weplacethetoolbartothenorthofthelayout.
JButtondriveBtn=newJButton(driveIcon);
driveBtn.setBorder(newEmptyBorder(3,0,3,0));
Inordertoputsomeemptyspacearoundthebutton,wehavetouseEmptyBorder.Thisaddssome
fixedspacetothetopandbottomofthebutton.Whenweaddfixedspaces,theUIisnotportable.A
3pxspacemaylookOKona1280x720screenbutitisinappropriateona1920x1200pxscreen.
add(vertical,BorderLayout.WEST);
Weplacetheverticaltoobartothewest.
add(newJTextArea(),BorderLayout.CENTER);
Weplacethetextareaintothecenter.
add(statusbar,BorderLayout.SOUTH);
Thestatusbargoestothesoutharea.
Figure:BorderLayout
CardLayout
CardLayoutisasimplelayoutmanagerthattreatseachcomponentasacard.Thecontainerisastack
ofthesecards.Onlyonecomponentisvisibleatatimetherestishidden.Thefirstcomponentadded
tothecontainerisvisiblebydefaultwhenthecontainerisinitiallydisplayed.Thismanagerhasa
limitedpracticaluse.Itcanbeusedtocreateawizardoratabbedpane.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 9/23
3/25/2017 TheSwinglayoutmanagement
ThefollowingexampleusesaCardLayoutmanagertocreateagalleryofimages.Weusefourimagesof
theKrasnaHorkacastle(beforethefirein2012).
CardLayoutEx.java
packagecom.zetcode;
importjava.awt.BorderLayout;
importjava.awt.CardLayout;
importjava.awt.Color;
importjava.awt.EventQueue;
importjava.awt.event.ActionEvent;
importjavax.swing.BorderFactory;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
publicclassCardLayoutExextendsJFrame{
privateImageIconhorka1;
privateImageIconhorka2;
privateImageIconhorka3;
privateImageIconhorka4;
privateImageIconprevi;
privateImageIconnexti;
privateJPanelmainPanel;
privateCardLayoutlayout;
publicCardLayoutEx(){
initUI();
}
privatevoidinitUI(){
mainPanel=newJPanel();
mainPanel.setBackground(newColor(50,50,50));
mainPanel.setBorder(
BorderFactory.createEmptyBorder(5,5,5,5)
);
layout=newCardLayout();
mainPanel.setLayout(layout);
horka1=newImageIcon("horka1.jpg");
horka2=newImageIcon("horka2.jpg");
horka3=newImageIcon("horka3.jpg");
horka4=newImageIcon("horka4.jpg");
previ=newImageIcon("previous.png");
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 10/23
3/25/2017 TheSwinglayoutmanagement
nexti=newImageIcon("next.png");
JLabellabel1=newJLabel(horka1);
JLabellabel2=newJLabel(horka2);
JLabellabel3=newJLabel(horka3);
JLabellabel4=newJLabel(horka4);
mainPanel.add(label1);
mainPanel.add(label2);
mainPanel.add(label3);
mainPanel.add(label4);
add(mainPanel);
JButtonprevButton=newJButton(previ);
prevButton.addActionListener((ActionEvente)>{
layout.previous(mainPanel);
});
JButtonnextButton=newJButton(nexti);
nextButton.addActionListener((ActionEvente)>{
layout.next(mainPanel);
});
JPanelbtnPanel=newJPanel();
btnPanel.setBackground(newColor(50,50,50));
btnPanel.add(prevButton);
btnPanel.add(nextButton);
add(btnPanel,BorderLayout.SOUTH);
pack();
setTitle("Gallery");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(()>{
CardLayoutExex=newCardLayoutEx();
ex.setVisible(true);
});
}
}
Wecreatetwobuttonstonavigatethroughtheimages.
mainPanel=newJPanel();
mainPanel.setBackground(newColor(50,50,50));
mainPanel.setBorder(
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 11/23
3/25/2017 TheSwinglayoutmanagement
BorderFactory.createEmptyBorder(5,5,5,5)
);
Wecreatethemainpanelcomponent.Wesetitscolourtodarkgray.Weput5pxaroundthepanelso
thatitschildrenarenottooclosetotheborderofthewindow.
layout=newCardLayout();
mainPanel.setLayout(layout);
TheCardLayoutmanageriscreatedandsettothemainpanel.
mainPanel.add(label1);
mainPanel.add(label2);
mainPanel.add(label3);
mainPanel.add(label4);
Thelabelcomponentsdisplayingtheimagesareaddedtothepanel.
JButtonprevButton=newJButton(previ);
prevButton.addActionListener((ActionEvente)>{
layout.previous(mainPanel);
});
ClickingonthePreviousbuttontheprevious()methodofthemanageriscalled.Itflipstothe
previouscardofthespecifiedcontainer.
add(mainPanel);
Weaddthemainpaneltothecenterareaoftheborderlayoutoftheframecomponent.Ifwedonot
specifyexplicitlywhereweplacethecomponent,itisaddedtothecenterarea.
JPanelbtnPanel=newJPanel();
btnPanel.setBackground(newColor(50,50,50));
btnPanel.add(prevButton);
btnPanel.add(nextButton);
Thebuttonsareaddedtothebuttonpanel.
add(btnPanel,BorderLayout.SOUTH);
Finally,thepanelwiththebuttonsisplacedintothesouthareaoftheBorderLayoutmanager.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 12/23
3/25/2017 TheSwinglayoutmanagement
Figure:CardLayout
BoxLayout
BoxLayoutmanagerisasimplelayoutmanagerthatorganizescomponentsinacolumnorarow.It
cancreatequitesophisticatedlayoutswithnesting.However,thisraisesthecomplexityofthelayout
creationandusesadditionalresources,notablymanyotherJPanelcomponents.BoxLayoutisonly
abletocreatefixedspacestherefore,itslayoutsarenotportable.
BoxLayouthasthefollowingconstructor:
BoxLayout(Containertarget,intaxis)
Theconstructorcreatesalayoutmanagerthatwilllayoutcomponentsalongthegivenaxis.Unlike
otherlayoutmanagers,BoxLayouttakesacontainerinstanceasthefirstparameterintheconstructor.
Thesecondparameterdeterminestheorientationofthemanager.Tocreateahorizontalbox,wecan
usetheLINE_AXISconstant.Tocreateaverticalbox,wecanusethePAGE_AXISconstant.
TheboxlayoutmanagerisoftenusedwiththeBoxclass.Thisclasscreatesseveralinvisible
components,whichaffectthefinallayout.
glue
strut
rigidarea
Let'ssaywewanttoputtwobuttonsintotherightbottomcornerofthewindow.
BoxLayoutButtonsEx.java
packagecom.zetcode;
importjava.awt.Dimension;
importjavax.swing.Box;
importjavax.swing.BoxLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 13/23
3/25/2017 TheSwinglayoutmanagement
importjavax.swing.SwingUtilities;
publicclassBoxLayoutButtonsExextendsJFrame{
publicBoxLayoutButtonsEx(){
initUI();
}
privatevoidinitUI(){
JPanelbasic=newJPanel();
basic.setLayout(newBoxLayout(basic,BoxLayout.Y_AXIS));
add(basic);
basic.add(Box.createVerticalGlue());
JPanelbottom=newJPanel();
bottom.setAlignmentX(1f);
bottom.setLayout(newBoxLayout(bottom,BoxLayout.X_AXIS));
JButtonok=newJButton("OK");
JButtonclose=newJButton("Close");
bottom.add(ok);
bottom.add(Box.createRigidArea(newDimension(5,0)));
bottom.add(close);
bottom.add(Box.createRigidArea(newDimension(15,0)));
basic.add(bottom);
basic.add(Box.createRigidArea(newDimension(0,15)));
setTitle("TwoButtons");
setSize(300,150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
BoxLayoutButtonsExex=newBoxLayoutButtonsEx();
ex.setVisible(true);
});
}
}
Thefollowingdrawingillustratestheexample.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 14/23
3/25/2017 TheSwinglayoutmanagement
Figure:Twobuttons
Wecreatetwopanels.Thebasicpanelhasaverticalboxlayout.Thebottompanelhasahorizontal
one.Wewillputabottompanelintothebasicpanel.Werightalignthebottompanel.Thespace
betweenthetopofthewindowandthebottompanelisexpandable.Itisdonebytheverticalglue.
basic.setLayout(newBoxLayout(basic,BoxLayout.Y_AXIS));
HerewecreateabasicpanelwiththeverticalBoxLayout.
JPanelbottom=newJPanel();
bottom.setAlignmentX(1f);
bottom.setLayout(newBoxLayout(bottom,BoxLayout.X_AXIS));
Thebottompanelisrightaligned.ThisisdonebythesetAlignmentX()method.Thepanelhasa
horizontallayout.
bottom.add(Box.createRigidArea(newDimension(5,0)));
Weputsomerigidspacebetweenthebuttons.
basic.add(bottom);
Hereweputthebottompanelwithahorizontalboxlayouttotheverticalbasicpanel.
basic.add(Box.createRigidArea(newDimension(0,15)));
Wealsoputsomespacebetweenthebottompanelandtheborderofthewindow.
Figure:BoxLayoutbuttonsexample
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 15/23
3/25/2017 TheSwinglayoutmanagement
WhenweuseaBoxLayoutmanager,wecansetarigidareabetweenourcomponents.
BoxLayoutRigidAreaEx.java
packagecom.zetcode;
importjava.awt.Dimension;
importjava.awt.Insets;
importjavax.swing.Box;
importjavax.swing.BoxLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.SwingUtilities;
importjavax.swing.border.EmptyBorder;
publicclassBoxLayoutRigidAreaExextendsJFrame{
publicBoxLayoutRigidAreaEx(){
initUI();
}
privatevoidinitUI(){
JPanelpanel=newJPanel();
panel.setLayout(newBoxLayout(panel,BoxLayout.Y_AXIS));
panel.setBorder(newEmptyBorder(newInsets(40,60,40,60)));
panel.add(newJButton("Button"));
panel.add(Box.createRigidArea(newDimension(0,5)));
panel.add(newJButton("Button"));
panel.add(Box.createRigidArea(newDimension(0,5)));
panel.add(newJButton("Button"));
panel.add(Box.createRigidArea(newDimension(0,5)));
panel.add(newJButton("Button"));
add(panel);
pack();
setTitle("RigidArea");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
BoxLayoutRigidAreaExex=newBoxLayoutRigidAreaEx();
ex.setVisible(true);
});
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 16/23
3/25/2017 TheSwinglayoutmanagement
}
}
Inthisexample,wedisplayfourbuttons.Bydefault,thereisnospacebetweenthebuttons.Toput
somespaceamongthem,weaddsomerigidarea.
panel.setLayout(newBoxLayout(panel,BoxLayout.Y_AXIS));
WeuseaverticalBoxLayoutmanagerforourpanel.
panel.add(newJButton("Button"));
panel.add(Box.createRigidArea(newDimension(0,5)));
panel.add(newJButton("Button"));
Weaddbuttonsandcreatearigidareainbetweenthem.
Figure:Rigidarea
TipoftheDay
JDeveloperhasadialogwindowcalledTipoftheDay.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 17/23
3/25/2017 TheSwinglayoutmanagement
Figure:TipoftheDay
Wewillcreateasimilardialog.Wewilluseacombinationofvariouslayoutmanagers,namely,a
borderlayout,flowlayout,andboxlayoutmanager.
packagezetcode;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.FlowLayout;
importjava.awt.event.KeyEvent;
importjavax.swing.BorderFactory;
importjavax.swing.BoxLayout;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JCheckBox;
importjavax.swing.JDialog;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JSeparator;
importjavax.swing.JTextPane;
importjavax.swing.SwingUtilities;
publicclassTipOfDayExampleextendsJDialog{
publicTipOfDayExample(){
initUI();
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 18/23
3/25/2017 TheSwinglayoutmanagement
publicfinalvoidinitUI(){
JPanelbasic=newJPanel();
basic.setLayout(newBoxLayout(basic,BoxLayout.Y_AXIS));
add(basic);
JPaneltopPanel=newJPanel(newBorderLayout(0,0));
topPanel.setMaximumSize(newDimension(450,0));
JLabelhint=newJLabel("JDeveloperProductivityHints");
hint.setBorder(BorderFactory.createEmptyBorder(0,25,0,0));
topPanel.add(hint);
ImageIconicon=newImageIcon("jdev.png");
JLabellabel=newJLabel(icon);
label.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
topPanel.add(label,BorderLayout.EAST);
JSeparatorseparator=newJSeparator();
separator.setForeground(Color.gray);
topPanel.add(separator,BorderLayout.SOUTH);
basic.add(topPanel);
JPaneltextPanel=newJPanel(newBorderLayout());
textPanel.setBorder(BorderFactory.createEmptyBorder(15,25,15,25));
JTextPanepane=newJTextPane();
pane.setContentType("text/html");
Stringtext="<p><b>Closingwindowsusingthemousewheel</b></p>"+
"<p>Clickingwiththemousewheelonaneditortabclosesthewindow."+
"ThismethodworksalsowithdockablewindowsorLogwindowtabs.</p>";
pane.setText(text);
pane.setEditable(false);
textPanel.add(pane);
basic.add(textPanel);
JPanelboxPanel=newJPanel(newFlowLayout(FlowLayout.LEFT,20,0));
JCheckBoxbox=newJCheckBox("ShowTipsatstartup");
box.setMnemonic(KeyEvent.VK_S);
boxPanel.add(box);
basic.add(boxPanel);
JPanelbottom=newJPanel(newFlowLayout(FlowLayout.RIGHT));
JButtonntip=newJButton("NextTip");
ntip.setMnemonic(KeyEvent.VK_N);
JButtonclose=newJButton("Close");
close.setMnemonic(KeyEvent.VK_C);
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 19/23
3/25/2017 TheSwinglayoutmanagement
bottom.add(ntip);
bottom.add(close);
basic.add(bottom);
bottom.setMaximumSize(newDimension(450,0));
setTitle("TipoftheDay");
setSize(newDimension(450,350));
setResizable(false);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(newRunnable(){
publicvoidrun(){
TipOfDayExampleex=newTipOfDayExample();
ex.setVisible(true);
}
});
}
}
Theexampleusesamixoflayoutmanagers.Simplyweputfourpanelsintotheverticallyorganized
basicpanel.
JPanelbasic=newJPanel();
basic.setLayout(newBoxLayout(basic,BoxLayout.Y_AXIS));
add(basic);
Thisistheverybottompanel.Ithasaverticalboxlayoutmanager.Thebasicpanelisaddedtothe
defaultJDialogcomponent.Thiscomponenthasaborderlayoutmanagerbydefault.
JPaneltopPanel=newJPanel(newBorderLayout(0,0));
ThetopPanelpanelhasaborderlayoutmanager.Wewillputthreecomponentsintoit.Twolabelsand
aseparator.
topPanel.setMaximumSize(newDimension(450,0));
Ifwewanttohaveapanelthatisnotgreaterthanitscomponents,wemustsetitsmaximumsize.The
zerovalueisignored.Themanagercalculatesthenecessaryheights.
JPaneltextPanel=newJPanel(newBorderLayout());
...
textPanel.add(pane);
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 20/23
3/25/2017 TheSwinglayoutmanagement
Thetextpanecomponentisaddedtothecenterareaoftheborderlayoutmanager.Ittakesallspace
left.Exactly,aswewanted.
JPanelboxPanel=newJPanel(newFlowLayout(FlowLayout.LEFT,20,0));
ThecheckboxisshownintheboxPanelpanel.Itisleftaligned.Theflowlayoutmanagerhasa20px
horizontalgap.Othercomponentshave25px.Whyisthat?Itisbecausetheflowlayoutmanagerputs
somespacetobetweenthecomponentandtheedgeaswell.
JPanelbottom=newJPanel(newFlowLayout(FlowLayout.RIGHT));
...
bottom.setMaximumSize(newDimension(450,0));
Thebottompaneldisplaystwobuttons.Ithasarightalignedflowlayoutmanager.Inordertoshow
thebuttonsontherightedgeofthedialog,thepanelmuststretchhorizontallyfromthebeginningto
theend.
Figure:TipoftheDay
Nomanager
Itispossibletogowithoutalayoutmanager.Theremightbefewsituationswherewemightnotneeda
layoutmanager.(Maybepositioningafewimagesatsomeirregularlocations.)Butinmostcasesto
createtrulyportable,complexapplications,weneedlayoutmanagers.
Withoutlayoutmanager,wepositioncomponentsusingabsolutevalues.
AbsoluteLayoutEx.java
packagecom.zetcode;
importjavax.swing.JButton;
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 21/23
3/25/2017 TheSwinglayoutmanagement
importjavax.swing.JFrame;
importjavax.swing.SwingUtilities;
publicclassAbsoluteLayoutExextendsJFrame{
publicAbsoluteLayoutEx(){
initUI();
}
privatevoidinitUI(){
setLayout(null);
JButtonokBtn=newJButton("OK");
okBtn.setBounds(50,50,80,25);
JButtonclsBtn=newJButton("Close");
clsBtn.setBounds(150,50,80,25);
add(okBtn);
add(clsBtn);
setTitle("Absolutepositioning");
setSize(300,250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(()>{
AbsoluteLayoutExex=newAbsoluteLayoutEx();
ex.setVisible(true);
});
}
}
Thissimpleexampleshowstwobuttons.
setLayout(null);
WeuseabsolutepositioningbyprovidingnulltothesetLayout()method.(TheJFramecomponent
hasadefaultlayoutmanager,theBorderLayout.)
okBtn.setBounds(50,50,80,25);
ThesetBounds()methodpositionstheOkbutton.Theparametersarethexandycoordinatesand
thewidthandheightofthecomponent.
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 22/23
3/25/2017 TheSwinglayoutmanagement
Figure:Absolutelayout
http://zetcode.com/tutorials/javaswingtutorial/swinglayoutmanagement/ 23/23