javaswing

Java Swing-03 Joylashuv boshqaruvi

JAVA SWING JOYLASHUV BOSHQARUVI
Java Swingda komponentlari ikki turga bo’linadi. Konteyner va bolalar. Konteynerlar bolalarni most joylashuv tartibiga guruhlaydi. Joylashuv tartibi yasash uchun Joylashuv boshqaruvlaridan foydalanamiz. Joylashuv tartibi boshqaruvi zamonaviy FGM dasturlashning eng qiyin mavzularidan biri.

BOSHQARUVSIZ
Agar istasak, hech qanday joylashuv bosharuvi ishlatmasligimiz ham mumkin. Boshqaruvi tartibi ekrak bo’lmaydigan holatlar ham bo’lishi mumkin. Masalan, biz o’zimizning misollarimizda kelgan aksariyat kodlarda joylashuv boshqaruvidan foydalanmaymiz. Buning asosiy sababi kodlarni murakkablashib ketishini istamaganligimiz uchundir. Lekin har qanday sharoitga most tusha oladigan murakkab FGM yasashda joylashuv boshqaruvidan foyadlanmay ilojimiz yo’q.

Joylashuv tartibidan foydalanmagan vaqtimizda komponentlar konteynerdan o’rin olganda ularga birlamchi (absolyut) qiymatlar beriladi.
*********************************** [highlighter]

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
 
public class AbsolyutMisol extends JFrame { 
 public AbsolyutMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  setLayout(null); 
 
  JButton okTugma = new JButton("OK"); 
  okTugma.setBounds(50, 50, 80, 25); 
 
  JButton yopishTugma = new JButton("Yopish"); 
  yopishTugma.setBounds(150, 50, 80, 25); 
 
  add(okTugma); 
  add(yopishTugma); 
 
  setTitle("Absolyut joylashuv"); 
  setSize(300, 250); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    AbsolyutMisol misol = new AbsolyutMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Bu misolimiz ekranga ikkita tugmali oynani chiqaradi.

setLayout(null);

Komponentlar joylashuvini absolyut, birlamchi holatga o’tkazish uchun setLayout() metodi argumentiga ‘null’ beramiz.

 okTugma.setBounds(50, 50, 80, 25);

setBounds() metodi ‘OK’ tugmasini joylashtirish uchun ishlatilgan. Parametrlarga x,y koordinata hamda eni va bo’yi ko’rsatiladi.

FlowLayout BOSHQARUVI
Bu Java Swing uskunalarining eng oddiy joylashuv boshqaruvidir. Bu boshqaruv asosan boshqa joylashuv tartibi boshqaruvlari bilan birgalikda ishlatiladi. Bolalarining o’lchamlarini hisoblaganda, FlowLayout boshqaruvi ularga tabbiy (ma’qul ko’rilgan) o’lchamni beradi.

Ushbu boshqaruv komponentlarni bir qatorga tizib joylashtiradi. Komponentlar ketma-ketligi ularning qo’shilishi bilan aniqlanadi. Agar ular bir qatorga sig’may qolsa, keyingi qatorga o’tkaziladi. Boshqaruv, komponentlarni istalgan yo’nalishda tartiblashga ham imkoniyat beradi. Komponentlar chapdan-o’ngga, yoki teskari tartibda joylashtirilishi mumkin. Oddiy holda ular markazdan boshlab tartiblanadi va har bir komponent hamda konteyner chegaralari orasida 5 pikseldan masofa saqlanadi.

 FlowLayout() 
 FlowLayout(int align) 
 FlowLayout(int align, int hgap, int vgap)

FlowLayout boshqaruvi yasashning uch hil konstruktori bor. Birinchisi oddiy holdagisini yasaydi, oddiy holda tartiblash markazdan boshlab, vertikal va gorizonatl tomondan 4 piksel tashlanib yasaladi. Boshqa konsturktorlarda esa bu parametrlarni o’zimiz ko’rsatishimiz mumkin.
***************************************************** [highlighter]

import java.awt.Dimension; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
 
public class FlowLayoutgaMisol extends JFrame { 
 
 public FlowLayoutgaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JPanel panel = new JPanel(); 
 
  JTextArea matnMaydon = new JTextArea("Matn maydoni"); 
  matnMaydon.setPreferredSize(new Dimension(100, 100)); 
 
  JButton tugma = new JButton("Tugma"); 
  panel.add(tugma); 
 
  JTree daraht = new JTree(); 
  panel.add(daraht); 
 
  panel.add(matnMaydon); 
 
  add(panel); 
 
  pack(); 
 
  setTitle("'FlowLayout'ga misol"); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    FlowLayoutgaMisol misol = new FlowLayoutgaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Bu misol tugma, daraxt, va matn maydonilik oynani ekranga chiqaradi. Shunisi qiziqki, agar biz bo’sh ‘daraxt’ komponentini yasasak, unda ba’zi bir boshlang’ich qiymatlar paydo bo’lib qoladi.

 JPanel panel = new JPanel();

JPanel komponenti yasalgan vaqtda uning dastlabki holatdagi joylashuv artbi FlowLayout bo’ladi. Biz FlowLayout ni o’rnatishimiz shart emas.

 JTextArea matnMaydon = new JTextArea("Matn maydoni");
 matnMaydon.setPreferredSize(new Dimension(100, 100));

bilan bir xil bo’lardi. Katta ham, kichik ham emas. Agar matnMaydon ga matn yozilmasa, u umuman ko’rimas ham edi. Agar setPreferredSize ni ishlatmasdan dasturni ishga tushirib, matnMaydon ga matn qo’shib yoki o’chirib ko’rsangiz, uning o’lchami ham most ravishda kattalashib, kichiklashadi.

 panel.add(matnMaydon);

Konteyner ichiga komponent joylashda, shunchaki add() metodidan foydalaniladi.

GRIDLAYOUT
GridLayout boshqaruvi komponentlarni to’rtburchakli kataklarga joylashtiradi. Konteyner bir hil o’lchamli kataklarga bo’linadi. Har bir katakka bittadan komponent joylanadi.

****************************************** [highlighter]

import java.awt.GridLayout;  
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
 
public class GridLayoutgaMisol extends JFrame { 
 
 public GridLayoutgaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JPanel panel = new JPanel(); 
 
  panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
  panel.setLayout(new GridLayout(5, 4, 5, 5)); 
 
  String[] tugmalar = { 
   "Cls", "Bck", "", "Yopish", "7", "8", "9", "/", "4", 
   "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" 
  }; 
 
 
  for (int i = 0; i < tugmalar.length; i++) { 
   if (i == 2) 
    panel.add(new JLabel(tugmalar[i])); 
   else 
    panel.add(new JButton(tugmalar[i])); 
  } 
 
  add(panel); 
 
  setTitle("GridLayoutga misol"); 
  setSize(350, 300); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    GridLayoutgaMisol misol = new GridLayoutgaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Bu misol huddi kalkulyatorga o’xshash dasturni ishga tushiradi. Bu biz o’rganayotgan joylashuv tartibi boshqaruviga eng yaxshi misol. Misolda 19 ta tugma va bitta label yasalib GridLayout boshqaruvchisiga joylashtirilgan. E’tibor bering, har bir tugmaning o’lchami bir xil.

 panel.setLayout(new GridLayout(5, 4, 5, 5));

Bu yerda panel komponentiga Gridlayout bochqaruvchisi o’rnatilgan. Layout boshqaruvchisi to’rtta parametr oladi. Qatorlar soni, ustunlar soni va komponentlar orasidagi vertikal va gorizontal bo’sh joylar.
BORDERLAYOUT
BorderLayout boshqaruvchisi boshqalariga qaraganda eng qo’l keladiganidir. Bundan ham yaxshisini ko’rmaganman. U joyni 5 qismga bo’ladi. Shimol, g’arb, janub, sharq va markaz. Har bir maydonga faqat bitta komponent joylanishi mumkin.  Agar biz maydonga birdan ortiq komponent joylashtirmoqchi bo’lsak, avvalo u yerga kerakli joylashuv tartibi boshqaruvilik panel o’rnatib, so’ngra har qancha komponent kerak bo’lsa o’sha panelni ichiga joylayveramiz. Shimol, g’arb, janub, sharq hududlaridagi komponentlar o’zlarining ma’qullangan o’lchamlarini olishadi. Markazdagi komponent esa ortib qolgan joyga egalik qiladi.
Agar bola komponentlar bir birlariga juda yaqin bo’lsa ham uncha chiroyli ko’rinmaydi. Ular orasida ozroq ochiq joy bo’lishi kerak. Swing uskunalaridagi har bir komponent o’zining chetidan chegara qo’yish mumkin. Chegarani EmptyBorder klasidan ob’ekt olib, yoki BorderFactory dan foydalanib yasaymiz. ‘EmptyBorder’dan boshqacha chegaralar ham bor. Lekin joylashuv tartibi boshqaruvi uchun biz faqat shuni ishlatamiz.
*************************************************** [highlighter]

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Insets; 
 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.EmptyBorder; 
 
public class ChegaragaMisol extends JFrame { 
 public ChegaragaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JPanel panel = new JPanel(new BorderLayout()); 
  JPanel tepasi = new JPanel(); 
 
  tepasi.setBackground(Color.gray); 
  tepasi.setPreferredSize(new Dimension(250, 150)); 
  panel.add(tepasi); 
 
  panel.setBorder(new EmptyBorder(new Insets(20, 20, 20, 20))); 
 
  add(panel); 
 
  pack(); 
 
  setTitle("Border Example"); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
       ChegaragaMisol ex = new ChegaragaMisol(); 
    ex.setVisible(true); 
   } 
  }); 
 } 
}

Bu misol atrofi chegaralangan kulrang panelli oynani ekranga chiqaradi.

  JPanel panel = new JPanel(new BorderLayout()); 
  JPanel tepasi = new JPanel();

Biz panelga panelni joylashtirdik. Birinchi panelga BorderLayout ishlatdik, sababi bu boshqaruv o’z bolasini ng o’lchamlarini o’zgartiradi.

panel.add(tepasi);

Bu yerda panel komponentga ‘tepasi’ panelini joyladik. Aniqroq qilib aytganda BorderLayout joylashuv tartibi boshqaruvining markaziy hududiga o’rnatdik.

 panel.setBorder(new EmptyBorder(new Insets(20, 20, 20, 20)));

Biz panelnig atrofiga 20 piksellik chegara yasadik. Chegara qiymatlari tepa, chap, past, o’ng (soat strelkasi yo’nalishiga teskari) tartibda tayinlanadi.
Keyingi misolda BorderLayout boshqaruvchisi dan yaxshiroq foydalanish ko’rsatilgan.
***************************************************************** [highlighter]

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Insets; 
 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JTextArea; 
import javax.swing.JToolBar; 
import javax.swing.SwingUtilities; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 
 
public class BorderLayoutgaMisol extends JFrame { 
 public BorderLayoutgaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JMenuBar menyuOrni = new JMenuBar(); 
  JMenu fayl = new JMenu("Fayl"); 
 
  menyuOrni.add(fayl); 
  setJMenuBar(menyuOrni); 
 
  JToolBar uskunalarGorizontal = new JToolBar(); 
  uskunalarGorizontal.setFloatable(false); 
 
  ImageIcon chiqish = new ImageIcon("chiqish.png"); 
  JButton tugmaChiqish = new JButton(chiqish); 
  tugmaChiqish.setBorder(new EmptyBorder(0 ,0, 0, 0)); 
  uskunalarGorizontal.add(tugmaChiqish); 
 
  add(uskunalarGorizontal, BorderLayout.NORTH); 
 
  JToolBar uskunalarVertikal = new JToolBar(JToolBar.VERTICAL); 
  uskunalarVertikal.setFloatable(false); 
  uskunalarVertikal.setMargin(new Insets(10, 5, 5, 5)); 
 
  ImageIcon diskYurituvchi = new ImageIcon("disk-yurituvchi.png"); 
  ImageIcon kompyuter = new ImageIcon("kompyuter.png"); 
  ImageIcon printer = new ImageIcon("printer.png"); 
 
  JButton diskYurTugma = new JButton(diskYurituvchi); 
  diskYurTugma.setBorder(new EmptyBorder(3, 0, 3, 0)); 
 
  JButton kompyuterTugma = new JButton(kompyuter); 
  kompyuterTugma.setBorder(new EmptyBorder(3, 0, 3, 0)); 
  JButton printerTugma = new JButton(printer); 
  printerTugma.setBorder(new EmptyBorder(3, 0, 3, 0)); 
 
  uskunalarVertikal.add(diskYurTugma); 
  uskunalarVertikal.add(kompyuterTugma); 
  uskunalarVertikal.add(printerTugma); 
 
  add(uskunalarVertikal, BorderLayout.WEST); 
 
  add(new JTextArea(), BorderLayout.CENTER); 
 
  JLabel statusbar = new JLabel("Statusbar"); 
  statusbar.setPreferredSize(new Dimension(-1, 22)); 
  statusbar.setBorder(LineBorder.createGrayLineBorder()); 
  add(statusbar, BorderLayout.SOUTH); 
 
  setSize(350, 300); 
  setTitle("'BorderLayout'ga misol"); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    BorderLayoutgaMisol misol = new BorderLayoutgaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Misolda o’ziga hos dastur ko’rinishi yasalgan. Biz vertikal va gorizontal joylashtirilgan uskunalar, status bar va markaziy komponent (matn maydoni)ni oynada ko’rsatdik.
JFrame komponenti uchun odatdagi boshqaruvchi ‘BorderLayout’dir. Shuning uchun uni biz o’rnatishimiz shart emas.

  add(uskunalarGorizontal, BorderLayout.NORTH);

JToolbar dan olingan uskunalarGorizontal ob’ektini joylashuvning shimoli (tepa qismi) ga qo’ydik.

 add(uskunalarVertikal, BorderLayout.WEST);

uskunalarVertikal ni g’arbga (chap tomonga) joyladik.

 add(new JTextArea(), BorderLayout.CENTER);

Matn maydonini markazga o’rnatdik.

 add(statusbar, BorderLayout.SOUTH);

‘statusbar’ni janubga (pastga) qo’ydik.
BOXLAYOUT
BoxLayout ham kuchli joylashtirish bosqaruvi bo’lib, uning yordamida nafis joylashuvlarni yasash mumkin. Bu turdagi joylashuv komponentlarni qatorlar yoki ustunlarga joylab beradi. Bu joylashuv boshqaruvini juda moslashuvchan holatga keltiruvchi uyalash, kuchli qulaylikni qo’llab quvvatlaydi. Ya’ni BoxLayout ichkarisiga yana bitta BoxLayout joylashtirishimiz mumkin.
Ko’pincha BoxLayout Box klasi bilan birgalikda ishlatiladi. Bu klas yakuniy joylashuvga ta’sir o’tkazuvchi bir nechta ko’rinmas komponentlar yasaydi.
* glue
* strut (viqor)
* rigid area (qattiq, bukilmaydigan maydon)
Aytaylik, oynaning pastki o’ng burchagiga ikkita tugma joylashtirmoqchimiz. Bunga erishish uchun BoxLayout boshqaruvlaridan foydalanamiz.
***’tarjima: Beginning Java’ dan:
javax.swing.BoxLayout klasi komponentlarni yagona qatorga yoki ustunga joylashtirishda qo’llaniladi. BoxLayout yasalayotgan vaqtda qatorli yoki ustunli joylashuv qo’llanilishi ko’rsatiladi. BoxLayout boshqaruvi klasini kosntruktorining ikkita argumenti bor, birinchisi BoxLayout tayinlanadigan konteyner, ikkinchi qatorli yoki ustunlik joylashuvni ko’rsatib beruvchi konstant. BoxLayout.X_AXIS qatorli joylashuvni, BoxLayout.Y_AXIS ustunlik joylashuvni ifodalaydi.
Qatorli joylashuvda komponentlar chapdan o’ngga, ustunlik joylashuvda esa tepadan pastga qarab qo’shilib boradi. Berilgan qator yoki ustundagi komponentlar qator yoki ustun to’lgan vaqtda yangisini yasab unga o’tib ketmaydilar (FlowLayoutdan boshqacha). Agar bitta qator yoki ustunga joylashtirilgan komponentlar soni ko’payib ketsa, joylashuv boshqaruvi ularning o’lchamini kichiklashtirib, zarur bo’lsa siqib bo’lsa ham baribir bitta qotor yoki ustunga joylaydi. BoxLayout boshqaruvi qatordagi komponentlarning bo’yini, ustundagi komponentlarning enini bir xil qilishga intiladi.
java.swing.Box konteyner klasining ichiga BoxLayout qo’shib yasalgan bo’lganligi uchun, BoxLayout bilan ishlaganda juda qo’l keladi. Uning komponentlarni tartiblashda boshqa konteynerlarga, masalan JPanel ob’ektiga qaraganda ko’proq moslashuvchanlik hususiyati ham bor. Box klasinign konstruktori bitta argument olib, unda BoxLayout.X_AXIS yoki BoxLayout.Y_AXIS tarzida yo’nalish ko’rsatiladi. Bu klasning yana ikkita statik createHorizontalBox() va createVerticalBox()metodlari ham bor, ularning har biri Box konteynerga tayinlangan yo’nalishlik javob qaytaradi(???).
****’Beginning Java’ dan tarjima tugadi.
********************************************** [highlighter]

import java.awt.Dimension; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
 
public class IkkitaTugmagaMisol extends JFrame { 
 
 public IkkitaTugmagaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
 
  JPanel asosiyPanel = new JPanel(); 
  asosiyPanel.setLayout(new BoxLayout(asosiyPanel, BoxLayout.Y_AXIS)); 
  add(asosiyPanel); 
 
  asosiyPanel.add(Box.createVerticalGlue()); 
 
  JPanel pastkiPanel = new JPanel(); 
  pastkiPanel.setAlignmentX(1); 
  pastkiPanel.setLayout(new BoxLayout(pastkiPanel, BoxLayout.X_AXIS)); 
 
  JButton okTugma = new JButton("OK"); 
  JButton yopishTugma = new JButton("Yopish"); 
 
  pastkiPanel.add(okTugma); 
  pastkiPanel.add(Box.createRigidArea(new Dimension(5, 0))); 
  pastkiPanel.add(yopishTugma); 
  pastkiPanel.add(Box.createRigidArea(new Dimension(15, 0))); 
 
  asosiyPanel.add(pastkiPanel); 
  asosiyPanel.add(Box.createRigidArea(new Dimension(0, 15))); 
 
  setTitle("Ikkita Tugma"); 
  setSize(300, 150); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    IkkitaTugmagaMisol misol = new IkkitaTugmagaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Quyidagi chizma misolimizdagi kodni tasvirlaydi.
//IkkitaTugmagaMisol.png
Biz ikkita panas yasadik. Asosiy panel vertikal quti joylashuviga ega. Pastki panel esa gorizontal. Biz pastki panelni asosiy panelga joyladik. Pastki panel tartibini o’ng tomonlama qildik. Oynaning ustki qismi bilan pastki panel orasidagi joy kengayuvchian (yoyiluvchan). Bu yoyiluvchanlik vertikal kley orqali amalga oshirilgan.

 asosiyPanel.setLayout(new BoxLayout(asosiyPanel, BoxLayout.Y_AXIS));

Bu yerda asosiy panel joylashuvini verikal BoxLayout qilib belgilayapmiz.

 JPanel pastkiPanel = new JPanel(); 
 pastkiPanel.setAlignmentX(1); 
 pastkiPanel.setLayout(new BoxLayout(pastkiPanel, BoxLayout.X_AXIS));

Pastki panel o’ng tarafdan tartiblaydi. Bu setAlignmentX metodi yordamida qilingan. Panel gorizontal joylashuvga ega.

 pastkiPanel.add(Box.createRigidArea(new Dimension(5, 0)));

Biz tugmalar orasiga o’zgarmas joy tayinladik.

 asosiyPanel.add(pastkiPanel);

Bu yerda biz patki panelni gorizontal joylashuvlik asosiy panelga joyladik.

 asosiyPanel.add(Box.createRigidArea(new Dimension(0, 15)));

Biz yana pastki panel va oyna chegaralari orasiga biroz joy tashladik.
BoxLayout boshqaruvchisidan foydalanganimizda, komponentlarimiz orasiga qo’zg’almas hudud o’rnatishimiz mumkin.
************************************************* [highlighter]

import java.awt.Dimension; 
import java.awt.Insets; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.EmptyBorder; 
 
public class QozgalmasHududgaMisol extends JFrame { 
 public QozgalmasHududgaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JPanel panel = new JPanel(); 
  panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
 
  panel.setBorder(new EmptyBorder(new Insets(40, 80, 40, 80))); 
 
  for(int i=0;i<4;i++){ 
   panel.add(new JButton("Tugma")); 
   panel.add(Box.createRigidArea(new Dimension(0, 5))); 
  } 
 
  add(panel); 
 
  pack(); 
 
  setTitle("Qo'zg'almas hudud."); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    QozgalmasHududgaMisol misol = new QozgalmasHududgaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Bu misolda, oynaga to’rtta tugma qo’shildi. Aslida tugmalar orasida hech qanday joy yo’q bo’lib ular bir birlariga yopishgan holda ko’rinishlari kerak edi. Biz ularning orasini ajratish uchun qo’zg’almas hudud qo’shdik.

 panel.setBorder(new EmptyBorder(new Insets(40, 80, 40, 80)));

‘panel’imizda uchun verikal BoxLayout boshqaruvchisidan foydalandik.

 for(int i=0;i<4;i++){ 
  panel.add(new JButton("Tugma")); 
  panel.add(Box.createRigidArea(new Dimension(0, 5))); 
 }

‘panel’ ga tugmalarni qo’shib, so’ng ular orasiga qo’zg’almas hudud joylayapmiz.

TIP OF THE DAY
JDeveloper va boshqa bir qancha dasturlar ‘Tip of the day‘ muloqot oynasiga ega
tipofday1.png
Biz ham shunga o’xshash oyna yasaymiz. Biz bir necha xil joylashuv boshqaruvlaridan birgallikda foydalanamiz. Jumladan BorderLayout, FlowLayout va BoxLayout boshqaruvlarini ishlatamiz.
******************************************** [highlighter]

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.KeyEvent; 
 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSeparator; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 
 
public class KunMalumotigaMisol extends JDialog { 
 public KunMalumotigaMisol() { 
  initFM(); 
 } 
 
 public final void initFM() { 
  JPanel asosPaneli = new JPanel(); 
  asosPaneli.setLayout(new BoxLayout(asosPaneli, BoxLayout.Y_AXIS)); 
  add(asosPaneli); 
 
  JPanel ustkiPanel = new JPanel(new BorderLayout(0, 0)); 
  ustkiPanel.setMaximumSize(new Dimension(450, 0)); 
  JLabel malumot = new JLabel("JDeveloperda samarali ishlash uchun qisqacha ma'lumotlar"); 
  malumot.setBorder(BorderFactory.createEmptyBorder(0, 25, 0, 0)); 
  ustkiPanel.add(malumot); 
 
  ImageIcon ikon = new ImageIcon("jdev.png"); 
  JLabel ikonkaliLabel = new JLabel(ikon); 
  ikonkaliLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
  ustkiPanel.add(ikonkaliLabel, BorderLayout.EAST); 
 
  JSeparator ajratgich = new JSeparator(); 
  ajratgich.setForeground(Color.gray); 
 
  ustkiPanel.add(ajratgich, BorderLayout.SOUTH); 
 
  asosPaneli.add(ustkiPanel); 
 
  JPanel matnPaneli = new JPanel(new BorderLayout()); 
  matnPaneli.setBorder(BorderFactory.createEmptyBorder(15, 25, 15, 25)); 
 
  JTextPane matnOrni = new JTextPane(); 
  matnOrni.setContentType("text/html"); 
  String matn = "<p><b>Sichqoncha aylantirgichi orqali oynani yopish</b></p>" + 
   "<p>Tahrirlash oynasining ustki qismiga sichqoncha aylantirgichi bilan chertilsa u oyna yopiladi. " + 
   "Bu uslub tahrirlash oynasiga o'xshash boshqa oynalarni yopishda ham qo'lllanilishi mumkin.</p>"; 
  matnOrni.setText(matn); 
  matnOrni.setEditable(false); 
  matnPaneli.add(matnOrni); 
 
  asosPaneli.add(matnPaneli); 
 
  JPanel checkBoxgaPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 0)); 
 
  JCheckBox checkBox = new JCheckBox("Dastur yuklanishida ma'lumotni ko'rsatish"); 
  checkBox.setMnemonic(KeyEvent.VK_D); 
 
  checkBoxgaPanel.add(checkBox); 
  asosPaneli.add(checkBoxgaPanel); 
 
  JPanel pastkiPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
 
  JButton keyingiMalumot = new JButton("Keyingi ma'lumot"); 
  keyingiMalumot.setMnemonic(KeyEvent.VK_K); 
  JButton yopish = new JButton("Yopish"); 
  yopish.setMnemonic(KeyEvent.VK_Y); 
 
  pastkiPanel.add(keyingiMalumot); 
  pastkiPanel.add(yopish); 
  asosPaneli.add(pastkiPanel); 
 
  pastkiPanel.setMaximumSize(new Dimension(450, 0)); 
 
  setTitle("Kun ma'lumoti"); 
  setSize(new Dimension(450, 350)); 
  setResizable(false); 
  setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
  setLocationRelativeTo(null); 
 } 
 
 public static void main(String[] args) { 
  SwingUtilities.invokeLater(new Runnable() { 
   public void run() { 
    KunMalumotigaMisol misol = new KunMalumotigaMisol(); 
    misol.setVisible(true); 
   } 
  }); 
 } 
}

Misolda bir necha hil joylashuv boshqaruvchilari birgalikda ishlatilingan. Biz oddiygina qilib vertikal joylashgan asosiy panel ichiga to’rtta panel joylashtirdik.

  JPanel asosPaneli = new JPanel(); 
  asosPaneli.setLayout(new BoxLayout(asosPaneli, BoxLayout.Y_AXIS));
  add(asosPaneli);

Bu panelni uyning poydevoriga o’xshatsak ham bo’ladi. Sababi, qolgan barcha panellar asosPaneli ning ustiga o’rnatilgan. asosPaneli ning o’zi JDialog komponentiga joylashtirilgan. Bu komponent yasalganda oddiy holatda BorderLayout boshqaruvchisini ishlatadi.

 JPanel ustkiPanel = new JPanel(new BorderLayout(0, 0));

ustkiPanel ham BorderLayout bochqaruvchisini ishlatadi. Biz uning ustiga yana uchta komponent joylaganmiz. Ikkita JLabel va bitta JSeparator (ajratgich).

 ustkiPanel.setMaximumSize(new Dimension(450, 0));

Agar panelimiz o’ziga joylashtiriladigan komponentlardan katta bo’lib ketmasligini istasak, biz unga maksimum o’lcham tayinlab qo’yishimiz kerak. Hattoki nol ham berishimiz mumkin. Bizning misolimizda ustki panel  balandligining o’lchamini nol bersak ham kattalashib ketayotganining sababi, uning bo’yi joylashuv boshqaruvchisi tomonidan avtomatik belgilanadi.

 JPanel matnPaneli = new JPanel(new BorderLayout()); 
 ... 
 matnPaneli.add(matnOrni);

matnOrni komponenti joylashuv bosharuvining maqrkazidan o’rin olgan. Bu aynan biz xohlaganimizdek, ortib qolgan joyning hammasini egallaydi.

 JPanel checkBoxgaPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 0));

JCheckBox komponenti checkBoxgaPanel ga o’rnatoldi. Bu paneldagi komponentlar chapdan boshlab tartiblanadi. FlowLayout boshqaruvining bir tomonidan 20 piksel bo’sh joy tashlandi. Boshqalarida 25 bunda nima uchu 20 degan savol tug’ilishi mumkin. Buning sababi FlowLayout har bir komponent va hatto uning chetlari orasida ham, doim 5 piksel masofa saqlaydi.

 JPanel pastkiPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
 pastkiPanel.setMaximumSize(new Dimension(450, 0));

pastkiPanel ikkita tugmani ko’rsatish uchun ishlatildi. Bunga o’ng tarafdan tartiblovchi FlowLayout boshqaruvchisi o’rnatilgan.
Bu bobda joylashuv tartibi boshqaruvi bilan biroz tanishdik.

(228 marta o'qilgan, bugun 1 marta o'qildi)

O'xshash maqolalar: