Programmering

Lær BoxLayout at kende

En af de standardlayoutledere, der følger med Java-platformen, er BoxLayout. Dette giver dig mulighed for at layout en enkelt række eller kolonne med komponenter i en container. Dette lyder måske som en ikke så kompliceret layoutmanager, men med hjælp fra Boks og dens lim og stivere, ville du tro, det ville være nok, men der er endnu mere. Den lodrette og vandrette justering af de underliggende komponenter tillader endnu mere kontrol med placeringen af ​​komponenter i containeren. Her ser vi på alle disse aspekter.

Typisk anvendelse

BoxLayout er i modsætning til de fleste layoutadministratorer, som bare kræver, at du opretter layoutmanageren og knytter layoutmanageren til Beholder. I stedet for BoxLayout konstruktør kræver, at du passerer Beholder ind i konstruktionen af ​​layoutadministratoren og har således en henvisning til den anden komponent i hver af dem. Dette kan nogle gange være akavet og gør brug af Boks beholder mere populær, da alt hvad du skal gøre er at bede om en vandret eller lodret udformning Boks gennem en af ​​dens statisk metoder:

 Box lodret = Box.createVerticalBox (); Boks vandret = Box.createHorizontalBox ();

Begge bruger BoxLayout under dækslerne, placer tilføjede komponenter på den rette adgang, afhængigt af retning. En lodret boks placerer alt i en enkelt kolonne, mens en vandret boks placerer alt i en række. Sammenligning BoxLayout (og dermed Boks) til GridLayout kræver en hurtig kommentar. Når du placerer en masse komponenter i en GridLayout kontrolleret container, forventes alle komponenter at have samme størrelse. Med BoxLayout, det er ikke tilfældet, og komponentens maksimale foretrukne størrelse respekteres.

Stivere og lim

Box-klassen tilbyder oprettelse af to understøttende komponenter, den ene en stiver eller fyldstof med fast størrelse, den anden lim til et udvideligt område. Brugen af ​​disse giver dig mulighed for at placere komponenter i en container, enten en fast afstand fra hinanden med en stiver eller et voksende / krympende område baseret på ledig plads med lim. Den samme opgave kan udføres med GridBagConstraints og GridBagLayout, dog ikke så let.

For at demonstrere opretter dette første program en 25 pixel stiv mellem de to øverste komponenter og en 10 pixel stiv mellem de to nederste.

import java.awt. *; import javax.swing. *; offentlig klasse 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 (ny knap ("Top")); box.add (Box.createVerticalStrut (25)); box.add (ny knap ("Mellem")); box.add (Box.createVerticalStrut (10)); box.add (ny knap ("Nederst")); frame.add (boks, BorderLayout.CENTER); frame.setSize (300, 200); frame.setVisible (true); }}

Når du har kompileret og kørt det, skal du bemærke, hvordan komponenterne ændres i størrelse, når vinduesstørrelsen steg eller faldt. Afstanden mellem komponenterne forbliver uændret for at matche det reserverede stiverum. Dette eksempel bruger en Knap i stedet for en JButton for at undgå en forklaring på komponentjustering indtil lidt senere.

Arbejde med en vandret kasse og lim giver lignende resultater, selvom denne gang limen vokser i størrelse for at optage ekstra plads i stedet for at forblive i en fast størrelse med stiver.

import java.awt. *; import javax.swing. *; offentlig klasse 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 (ny JButton ("Venstre")); box.add (ny JButton ("Højre")); frame.add (boks, BorderLayout.NORTH); box = Box.createHorizontalBox (); box.add (ny JButton ("Venstre")); box.add (Box.createHorizontalGlue ()); box.add (ny JButton ("Højre")); frame.add (boks, BorderLayout.CENTER); box = Box.createHorizontalBox (); box.add (ny JButton ("Venstre")); box.add (ny JButton ("Højre")); box.add (Box.createHorizontalGlue ()); frame.add (boks, BorderLayout.SOUTH); frame.setSize (300, 200); frame.setVisible (true); }}

Forsøger ikke at forvirre dig for meget, men eksemplet er tilbage til at bruge JButton komponenter.

Justering

Livet bliver interessant med Box / BoxLayout når komponenterne i beholderen har en anden størrelse, eller beholderens højde / bredde er bredere end nødvendigt for en lodret kasse eller højere end nødvendigt med en vandret. Med andre ord, hvis du har en høj søjle, hvor ender komponenter med en anden bredde? Og hvis du har en bred række med komponenter i en anden højde, hvad med dem?

Det er her, de forskellige justeringer af en komponent kommer i spil. Hver Swing-komponent har en X-justering indstilling og en Y-justering indstilling takket være dens get / setAlignmentX () og get / setAlignmentY () metoder. Rækkevidden for hver indstilling er fra 0 til 1.0, inklusive, hvor 0 repræsenterer venstre- eller topjustering og 1 repræsenterer højre eller nederste justering afhængigt af retningen af BoxLayout. Der er konstanter tilgængelige i Komponent klasse, så du ikke rigtig behøver at vide, hvad værdierne er for højre- og venstrejustering. Det hjælper dog at vide, om du måske vil have noget imellem.

For at demonstrere højre, venstre, midterste natur for forskellige størrelsesknapper i en lodret boks opretter følgende program tre felter, en hver fyldt med venstre, center og højre justerede knapper.

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-knap = ny JButton (etiket); button.setAlignmentX (justering); box.add (knap); } returboks; } privat statisk String makeLabel (String s, int længde) {StringBuffer buff = ny StringBuffer (længde); for (int i = 0; i

Lad os nu blande tingene lidt sammen og have en lodret boks med tre knapper, en til hver justering. Skærmbredden vil være bred for at sikre, at der er ekstra plads til rådighed. Begrebsmæssig tænkning ville man forvente, at komponenten med venstrejustering skulle være justeret til venstre for beholderen, og den med højrejustering skulle være justeret til højre for beholderen. Det ville dog være forkert. Når der er forskellige komponentjusteringer, er de justeret til midten af ​​beholderen. Så til venstrejustering vil den pågældende komponent have sin venstre kant på beholderens usynlige midterlinie. Til højre justering er det den højre kant.

Her er programmet til demonstration:

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-knap = ny JButton ("LL"); button.setAlignmentX (Component.LEFT_ALIGNMENT); box.add (knap); knap = ny JButton ("CC"); button.setAlignmentX (Component.CENTER_ALIGNMENT); box.add (knap); knap = ny JButton ("RR"); button.setAlignmentX (Component.RIGHT_ALIGNMENT); box.add (knap); frame.add (boks, BorderLayout.CENTER); frame.setSize (300, 200); frame.setVisible (true);}} 

Og den bekræftende skærm:

Arbejde i den anden retning har topjustering, der tilpasser komponentens top til den imaginære midterlinje eller med andre ord under midten.

At blande justeringer på denne måde fungerer fint, men det tager bare noget at vænne sig til, da justeringen ikke nødvendigvis er, hvor du ville forvente, at den skulle være, medmindre alle justeringerne er de samme, og derefter justeres den til containergrænsen, i modsætning til containerens centrumlinje.

Hvis du stadig er forvirret, er du velkommen til at ændre de tidligere programmer og prøve endnu flere kombinationer af x og y justering. Selvfølgelig, hvis alt dette forvirrer dig, er der altid GridBagLayout.

******

SDN Chat: Mød forfatterne af java.sun.com

Deltag venligst i Suns Developer Playground i Second Life på torsdag, 14. februar kl. 10 PST for at møde forfatterne af java.sun.com. Ed Ort, Dana Nourie, Janice Heiss og Laureen Hudson vil være i verden for at diskutere deres eventyr skriftligt til et af branchens mest populære websteder og dele de teknologier og tendenser, de vil holde øje med i 2008. Og for første gang, SMI Press er glad for at kunne tilbyde deltagerne en af ​​tre nye SMI Press-bøger gratis!

Denne historie, "At lære BoxLayout at kende", blev oprindeligt udgivet af JavaWorld.