wiki:GUIKomponenttienKoonMuuttaminen
Last modified 4 years ago Last modified on 2014-02-12 10:28:40

Käyttöliittymäkomponenttien koon muuttaminen

Luennoilla(kin) on tullut esiin ongelmia käyttöliittymäkomponenttien (kuten JLabel, JButton) koon muuttamisessa. Tällä sivulla on yhteenveto Eclipsen kanssa käytettävän WindowBuilderin ja NetBeans IDEn eroista tässä suhteessa. Nämä tiedot ovat vain nopean testaamisen tuloksia, korjaukset ovat tervetulleita. Katso myös WindowBuilderin ohjeet ja Eclipsen käyttö.

Periaate

  • Komponentin asetettavissa oleviin attribuutteihin vaikuttaa kys. komponentin 'isäntäkomponentti' (parent). Komponentin parent:in voi tarkistaa kys. komponentin ominaisuuksista kohdasta 'Accessible parent'.
    • parent-komponentille asetettu Layout (AbsoluteLayout, FlowLayout, BoxLayout, jne.) määrää, miten vaikkapa JLabel-komponentin kokoa voi muokata.

Oletuslayoutit

  • Eclipse
    • Luotaessa projektiin uusi JFrame (New -> Other -> WindowBuilder -> JFrame), Eclipse/WindowBuilder luo JFramen alle contentPane-nimisen JPanel-komponentin, jonka layout on oletuksena BorderLayout. contentPane:en lisättävät komponentit saavat oletuksena FlowLayoutin
    • Eclipsen generoima koodi:
              /**
      	 * Create the frame.
      	 */
      	public LayoutTestGUI() {
      		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		setBounds(100, 100, 450, 300);
      		contentPane = new JPanel();
      		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
      		contentPane.setLayout(new BorderLayout(0, 0));  // <--
      		setContentPane(contentPane);
      
  • NetBeans
    • NetBeans ei oletuksena luo JFramen alle JPanel-komponenttia valmiiksi. NetBeansissa uudet komponentit käyttävät oletuksena GroupLayout asettelua (NetBeansin asetuksista riippuen joko javax.swing.GroupLayout tai siitä johdettua org.jdesktop.layout.GroupLayout), joka NetBeansin valikoissa on fiksusti nimetty FreeDesign. (lisätietoa)

Eclipse + WindowBuilder

Testattu JButton- ja JLabel-komponenteilla. Eclipsen käyttäytyminen eroaa huomattavasti Netbeansista.

AbsoluteLayout

  • komponentin koko asetetaan widht ja height attribuuteilla (löytyy Bounds-kohdan alta)
  • minimumSize, maximumSize, preferredSize eivät vaikuta.
  • NetBeansissa bounds-attribuutti ei vaikuta komponentin kokoon, vaikkakin bounds-attribuutin saamat arvot kopioituvat myös size-attribuuttiin
  • Eclipsessa AbsoluteLayout on koodissa asetettu seuraavasti:
       contentPane = new JPanel();
       contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
       setContentPane(contentPane);
       contentPane.setLayout(null);  // <--
    
    • vertaa NetBeansin tuottama koodi alla

FlowLayout

  • vain preferredSize vaikuttaa komponentin kokoon

BoxLayout

  • Design-tilassa komponentin koko näyttää muuttuvan vain maximumSize-attribuutin arvoa muuttamalla silloin kun samassa containerissa (esim. JPanelin sisällä) on vain yksi komponentti
  • Jos containerin sisällä on useampia komponentteja (kuten vaikkapa editPanel), preferredSize-attribuuttia muuttamalla saadaan komponenteista halutun kokoisia: muutettavien komponenttien koko asettuu halutuksi kun containerin sisään lisätään muita komponentteja.

NetBeans

Testattu JButton- ja JLabel-komponenteilla

AbsoluteLayout

  • vain preferredSize vaikuttaa komponentin kokoon (voi asettaa myös kohdasta Layout -> Width/Height?, nämä oletuksena käyttävät muutenkin preferredSizen arvoja)
  • NetBeansissa AbsoluteLayout asetetaan koodissa seuraavasti:
     jPanel1 = new javax.swing.JPanel();
     jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
    

FreeDesign

  • ensisijaisesti Layout -> Horizontal Size, Vertical Size (asetettu arvo tai Default)
  • preferredSize (jos arvot suuremmat kuin Default)
  • maximumSize/minimumSize ei vaikutusta

BoxLayout

  • maximumSize vaikuttaa leveyteen riippumatta preferredSize:n arvosta
  • preferredSize vaikuttaa korkeuteen riippumatta maximumSize:n arvosta
  • minimumSize ei vaikuta (Default ohittaa)
  • muutoin komponentin koko Default

FlowLayout

  • minimumSize ei vaikuta (Default ohittaa)
  • maximumSize ei vaikuta (Default ohittaa)
  • preferredSize määrää komponentin koon jos arvot suuremmat kuin Default, muutoin Default

Huomioita

  • Testatut ympäristöt
    • Mac OS X 10.6.8
      • JDK 6 Update 30 (1.6.0_30)
      • Eclipse 3.7 + WindowBuilder
      • Netbeans 7.1