JAVA-OHJELMOINTI 3 op A274615 Layoutit Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi, Talentum 2004. Layout Managerit Tavallisesti ohjelmien käyttöliittymien ikkunat tehdään kiinteän kokoisiksi helppoa Ei tarvitse tehdä erikseen ikkunan koon mukaan muuttuvaa asettelua eri komponenteille Javassa säiliöillä on valmiit asettelijat, layout managerit, jotka vastaavat komponenttien sijoittelusta
Layout Managerit Säiliön asettelija voidaan myös asettaa null:ksi, jolloin saadaan absoluuttinen paikan ja koon määritys Absoluuttisen määrityksen eräs huono puoli on se, että sovelluksen skaalaus ei enää onnistu Huonosti käy myös, jos fontteja tai localeja yritetään muuttaa (kirjoitussuunta???) Layoutien käyttö on erittäin suositeltavaa Layout Managerit Layout Managerilla voi määrittää komponenttien koon ja paikan säiliön sisällä Toteuttaa LayoutManager-interfacen Layout managerit: FlowLayout BorderLayout CardLayout GridLayout GridBagLayout BoxLayout SpringLayout Oletus-layout JPanel-olioilla on FlowLayout Visual index: http://java.sun.com/docs/books/tutorial/uiswing/ layout/visual.html
FlowLayout Yksinkertaisin asettelija Komponentit säiliön sisälle peräkkäin Tarvittaessa asetellaan useammalle riville Metodilla setalignment() voidaan määrittää komponenttien tasaus: CENTER, LEADING, TRAILING (LEFT, RIGHT) Lisäksi voidaan antaa komponenttien väliin jäävä tyhjä tila sethgap() ja setvgap()-metodeilla Nämä voidaan tehdä myös suoraan konstruktorissa Look & Feel saattaa vaikuttaa asettelijoihinkin (esim. Framen minimikoko, tms.) BorderLayout Melko helppokäyttöinen ja kätevä asettelija Komponentit voidaan asettaa joko ylös, alas, vasemmalle, oikealle tai keskelle: PAGE_START, PAGE_END, LINE_START, LINE_END, CENTER (NORTH, SOUTH, WEST, EAST) Keskiosaan tulee kaikki muilta yli jäävä tila Lisättäessä komponenttia pitää antaa myös sen paikka panel.add(button,borderlayout.page_start); Komponenttien väliin jäävä tyhjä tila samoin sethgap() ja setvgap()-metodeilla Nämä voidaan tehdä myös suoraan konstruktorissa
CardLayout Ehkä hieman harvemmin käytetty Antaa käyttäjän valita erilaisten näkymien ( Card ) välillä Tyypillisesti valintaa varten luodaan combo box Samantyyppisen toiminnan voi toteuttaa helpommin (mutta rajoitetummin) tabbed panelilla Layoutiin lisätään esim. JPanel-olioita, joille annetaan nimi Näitä voi kutsua näkyviin nimen perusteella käyttämällä CardLayoutin show()-metodia Toinen vaihtoehto on selata näkymiä next(), previous(), first() ja last()-metodeilla GridLayout Melko helppokäyttöinen asettelija Komponentit asetellaan kuin taulukon soluihin Asettelijalle annetaan rivien ja sarakkeiden määrä Toinen voidaan asettaa dynaamiseksi, jolloin arvoksi annetaan 0 (esim. new GridLayout(0,2) luo kaksi saraketta ja rivejä tarpeen mukaan) Komponenttien väliin jäävä tyhjä tila samoin sethgap() ja setvgap()-metodeilla Nämä voidaan tehdä myös suoraan konstruktorissa
GridBagLayout Monipuolinen (ja hankala?) asettelija Asettelijalla vain 1 konstruktori, ei parametreja Komponentit asetellaan taulukon soluihin, mutta Komponentit voivat sijaita usean solun sisällä Rivien korkeus voi vaihdella Sarakkeiden leveys voi vaihdella Komponenteille asetetaan rajoitteita (GridBagConstrains) esim. sijoittelun ja skaalauksen suhteen GridBagLayout GridBagConstraints gridx, gridy komponentin vasemman yläreunan paikka taulukossa gridwidth, gridheight komponentin käyttämien sarakkeiden ja rivien määrä fill määrittää täyttötavan, jos tila on suurempi kuin komponentin vaatima koko ipadx, ipady komponentin sisään tulevan täytön määrä pikseleissä insets komponentin ympärille tulevan täytön määrä anchor komponentin ankkurointi weightx, weighty painotus, joka määrää riveille ja sarakkeille annettavan tilan = taidetta
BoxLayout Yksinkertainen, paranneltu versio FlowLayoutista Komponentit joko yhteen riviin tai yhteen sarakkeeseen Käyttökelpoinen, kun tarvitaan yksinkertaisia dialogeja, valintaruutuja, tms. Asettelija luodaan antamalla konstruktorissa sekä asettelijaa käyttävä komponentti että asettelijan tyyli (PAGE_AXIS, LINE_AXIS): JPanel panel = new JPanel(); panel.setlayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS); BoxLayout ottaa myös huomioon komponenttien maksimikoon sekä niiden tasauksen Jos tyylinä on ylhäältä alas: Ylimääräinen tila (jos sellaista jää) tulee säiliön alareunaan, kun komponentit laitetaan ylhäältä alas Kaikista komponenteista yritetään tehdä yhtä leveitä Kaikki komponentit asetellaan toisiinsa kiinni tyhjää tilaa voi lisätä reunoilla tai näkymättömillä komponenteilla (Box ja Box.Filler) BoxLayoutin ominaisuudet ovat melko joustavat lisätietoa voit katsoa osoitteesta: http://java.sun.com/docs/books/tutorial/uiswing/layout/box.html SpringLayout Lisätty JDK 1.4:ään Joustava asettelija, jolla voi matkia aika monen muun asettelijan käyttäytymistä Kehitettiin GUI-rakentajia varten Toiminta perustuu komponenttien reunojen välisten suhteiden määrittelyyn Etäisyydet reunojen välillä määritellään Spring-olioilla Spring sisältää neljä ominaisuutta: minimum, maximum, preferred, (current) value Spring-oliot kerätään SpringLayout.Constrains-olioon Käyttöä helpottamaan on tehty useita apumetodeja, jotka löytyvät SpringUtilities-luokasta Lisätietoa webistä: http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html