Mengenal BoxLayout

Salah satu manajer tata letak standar yang disertakan dengan platform Java adalah BoxLayout. Ini memungkinkan Anda untuk menata satu baris atau kolom komponen dalam satu wadah. Ini mungkin terdengar seperti manajer tata letak yang tidak terlalu rumit, tetapi dengan bantuan Boxlem dan penyangga, Anda akan berpikir itu sudah cukup, tetapi bahkan ada lebih dari itu. Penjajaran vertikal dan horizontal dari komponen yang mendasari memungkinkan kontrol yang lebih besar atas posisi komponen di dalam wadah. Di sini, kita akan melihat semua aspek ini.

Penggunaan Khas

BoxLayout tidak seperti kebanyakan pengelola tata letak yang hanya mengharuskan Anda membuat pengelola tata letak, dan mengaitkan pengelola tata letak dengan Container. Sebaliknya, BoxLayoutkonstruktor mengharuskan Anda meneruskan Containerke konstruktor pengelola tata letak, sehingga memiliki referensi ke komponen lain di masing-masingnya. Ini kadang-kadang bisa menjadi canggung, dan membuat penggunaan Boxwadah lebih populer, karena yang harus Anda lakukan hanyalah meminta penataan horizontal atau vertikal Boxmelalui salah satu staticmetodenya:

 Box vertical = Box.createVerticalBox(); Box horizontal = Box.createHorizontalBox();

Keduanya menggunakan di BoxLayoutbawah penutup, menempatkan komponen tambahan pada akses yang tepat, tergantung pada arah. Kotak vertikal menempatkan semuanya ke dalam satu kolom, sedangkan kotak horizontal menempatkan semuanya dalam satu baris. Membandingkan BoxLayout(dan karenanya Box) GridLayoutmembutuhkan komentar cepat. Saat menempatkan banyak komponen dalam GridLayoutwadah terkontrol, semua komponen diharapkan berukuran sama. Dengan BoxLayout, bukan itu masalahnya, dan ukuran maksimum komponen yang disukai akan diperhatikan.

Struts and Glue

Kelas Box menawarkan pembuatan dua komponen pendukung, satu penyangga, atau area pengisi berukuran tetap, yang lain merekatkan untuk area yang dapat diperluas. Penggunaan ini memungkinkan Anda untuk menempatkan komponen di dalam wadah, baik jarak tetap terpisah dengan penyangga, atau area yang tumbuh / menyusut berdasarkan ruang yang tersedia, dengan lem. Tugas yang sama dapat dilakukan dengan GridBagConstraintsdan GridBagLayout, meskipun tidak semudah itu.

Untuk mendemonstrasikan, program pertama ini membuat penyangga 25 piksel antara dua komponen teratas dan penyangga 10 piksel antara dua bagian bawah.

import java.awt.*; import javax.swing.*; public class VerticalBoxTest { public static void main(String args[]) { JFrame frame = new JFrame("Vertical Box"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createVerticalBox(); box.add(new Button("Top")); box.add(Box.createVerticalStrut(25)); box.add(new Button("Middle")); box.add(Box.createVerticalStrut(10)); box.add(new Button("Bottom")); frame.add(box, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true); } }

Setelah Anda mengkompilasi dan menjalankannya, perhatikan bagaimana ukuran komponen berubah ketika ukuran jendela bertambah atau berkurang. Jarak antara komponen tetap tidak berubah, agar sesuai dengan ruang penyangga yang dipesan. Contoh ini menggunakan a Buttonsebagai ganti a JButtonuntuk menghindari penjelasan tentang penyelarasan komponen sampai nanti.

Bekerja dengan kotak dan lem horizontal menghasilkan hasil yang serupa, meskipun kali ini ukuran lem bertambah besar untuk mengambil ruang tambahan, alih-alih tetap berukuran tetap, dengan penyangga.

import java.awt.*; import javax.swing.*; public class HorizontalBoxTest { public static void main(String args[]) { JFrame frame = new JFrame("Horizontal Box"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createHorizontalBox(); box.add(Box.createHorizontalGlue()); box.add(new JButton("Left")); box.add(new JButton("Right")); frame.add(box, BorderLayout.NORTH); box = Box.createHorizontalBox(); box.add(new JButton("Left")); box.add(Box.createHorizontalGlue()); box.add(new JButton("Right")); frame.add(box, BorderLayout.CENTER); box = Box.createHorizontalBox(); box.add(new JButton("Left")); box.add(new JButton("Right")); box.add(Box.createHorizontalGlue()); frame.add(box, BorderLayout.SOUTH); frame.setSize(300, 200); frame.setVisible(true); } }

Berusaha untuk tidak terlalu membingungkan Anda, tetapi contohnya adalah kembali menggunakan JButtonkomponen.

Penjajaran

Hidup menjadi menarik Box/BoxLayoutketika komponen di dalam wadah memiliki ukuran yang berbeda atau tinggi / lebar wadah lebih lebar dari yang diperlukan untuk kotak vertikal atau lebih tinggi dari yang diperlukan dengan kotak horizontal. Dengan kata lain, jika Anda memiliki kolom tinggi, di manakah komponen dengan lebar berbeda akan berakhir? Dan, jika Anda memiliki deretan lebar dengan komponen dengan ketinggian berbeda, bagaimana dengan mereka?

Di sinilah berbagai keselarasan komponen berperan. Setiap komponen swing memiliki X-alignmentpengaturan dan Y-alignmentpengaturan berkat nya get/setAlignmentX()dan get/setAlignmentY()metode. Kisaran setiap pengaturan adalah dari 0hingga 1.0, inklusif, di mana 0mewakili perataan kiri atau atas dan 1mewakili perataan kanan atau bawah, bergantung pada arah BoxLayout. Ada konstanta yang tersedia di Componentkelas sehingga Anda tidak perlu tahu apa nilai untuk perataan kanan dan kiri. Namun, akan membantu untuk mengetahui apakah Anda mungkin menginginkan sesuatu di antaranya.

Untuk mendemonstrasikan sifat kanan, kiri, tengah dari tombol ukuran berbeda dalam kotak vertikal, program berikut membuat tiga kotak, masing-masing diisi dengan tombol rata kiri, tengah, dan kanan.

import java.awt.*; import javax.swing.*; public class AlignX { private static Container makeIt(String labelChar, float alignment) { Box box = Box.createVerticalBox(); for (int i=1; i<6; i++) { String label = makeLabel(labelChar, i*2); JButton button = new JButton(label); button.setAlignmentX(alignment); box.add(button); } return box; } private static String makeLabel(String s, int length) { StringBuffer buff = new StringBuffer(length); for (int i=0; i
    

Now, let us mix things up a little and have one vertical box with three buttons, one for each alignment. The screen width will be wide, to make sure there is extra space available. Conceptually thinking, one would expect the component with left alignment to be aligned to the left of the container and the one with right alignment to be aligned to the right of the container. That would be wrong though. When there are different component alignments, they are aligned to the center of the container. So, for left alignment, that component will have its left edge on the invisible center line of the container. For right alignment, it is the right edge.

Here's the program to demonstrate:

import java.awt.*; import javax.swing.*; public class AlignX2 { public static void main(String args[]) { JFrame frame = new JFrame("X Alignment"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createVerticalBox(); JButton button = new JButton("LL"); button.setAlignmentX(Component.LEFT_ALIGNMENT); box.add(button); button = new JButton("CC"); button.setAlignmentX(Component.CENTER_ALIGNMENT); box.add(button); button = new JButton("RR"); button.setAlignmentX(Component.RIGHT_ALIGNMENT); box.add(button); frame.add(box, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true);} } 

And, the corroborating screen:

Working in the other direction has top alignment aligning the top of the component to the imaginary center line, or in other words below the center.

Mixing up alignments in this fashion works fine, but just takes some getting used to, as the alignment isn't necessarily where you would expect it to be, unless all the alignments are the same, and then it does align to the container border, as opposed to the container center line.

If you are still confused, feel free to modify the earlier programs and try even more combinations of x and y alignment. Of course, if all this baffles you, there is always GridBagLayout.

******

SDN Chat: Meet the Writers of java.sun.com

Please join us in Sun's Developer Playground in Second Life on Thursday, February 14 at 10am PST to meet the writers of java.sun.com. Ed Ort, Dana Nourie, Janice Heiss, and Laureen Hudson will be inworld to discuss their adventures in writing for one of the industry's most popular websites and to share the technologies and trends they'll be keeping their eyes on in 2008. And, for the first time, SMI Press is pleased to offer attendees one of three new SMI Press books for free!

This story, "Getting to Know BoxLayout" was originally published by JavaWorld .