4-a: Esittele Javan Swingin tärkeimmät käyttöliittymäelementit. Anna yksinkertaisia mutta valaisevia ja toimivia ohjelmaesimerkkejä. Esittele myös elementtien luokkahierarkia Object-luokkaan asti. Millaisia yhteisiä ominaisuuksia on useilla eri käyttöliittymäkomponenteilla (esim. tooltipit, enabled/disabled-tila), mistä luokasta ominaisuudet löytyvät ja miten ominaisuuksia käytetään? Toiko Javan versio 1.5 joitakin muutoksia käyttöliittymäelementteihin, luokkahierarkiaan tms?

- Swingissä on kolme top level container -luokkaa, JFrame, JDialog ja JApplet. Jokaisella niistä on content pane, joka sisältää ruudulla näkyvät käyttöliittymäkomponentit, esim. napit tai pudotuslistat. Top level container voi sisältää myös päävalikon, joskin se liitetään yleensä vain JFrame-luokkaan.

- Varsinaisia näytölle liitettäviä komponentteja kuten nappeja, tekstikenttää, radiobuttoneita, jne. on runsas valikoima. Kaikkien niiden yliluokkana toimii JComponent-luokka. Kaikki komponentit perivät JComponent-luokalta myös tietyn perustoiminnallisuuden kuten enabled/disabled -toiminnallisuuden, eli setEnabled() metodilla on mahdollista aktivoida ja deaktivoida haluttu komponentti.

- Esim. JButton-komponentin luokkahierarkia:

java.lang.Object
  -> java.awt.Component
    -> java.awt.Container
      -> javax.swing.JComponent
        -> javax.swing.AbstractButton
          -> javax.swing.JButton
JFrame:
java.lang.Object
  -> java.awt.Component
    -> java.awt.Container
      -> java.awt.Window
        -> java.awt.Frame
          -> javax.swing.JFrame
JPanel:
java.lang.Object
  -> java.awt.Component
    -> java.awt.Container
      -> javax.swing.JComponent
        -> javax.swing.JPanel
4-1: Vertaile AWT:tä ja Swingiä. Millaisia eroja ja yhtäläisyyksiä niillä on? Millainen historia niillä on? Miksi?

AWT (Abstract Windows Toolkit) on alkuperäinen Javan kirjasto graafisen käyttöliittymän komponenteille. AWT:n komponentit mäppäytyvät automaattisesti kulloinkin käytettävän käyttöjärjestelmän graafisen käyttöliittymän komponentteihin. AWT sopii yksinkertaisten GUI-sovellusten ja applettien toteuttamiseen, mutta isompiin projekteihin kannattaa käyttää Javan 2-versiossa esiteltyä Swingiä. Swing-komponentit piirretään näytölle Java-koodin avulla lukuunottamatta komponentteja, jotka ovat java.awt.window tai java.awt.Panel -luokkien aliluokkia. Tuki AWT:lle saattaa kuitenkin loppua tulevissa Java-versioissa. 4-2: Tee graafinen sovellus, joka esittelee käyttöliittymäkomponentteja JButton, JLabel, JRadioButton, JSlider, JTextArea ja JTextField, ym. Esittelyn ei tarvitse olla mitenkään dynaaminen. Kokeile erilaisia ulkoasuja: Motif, Metal, (Windows).

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class SwingTest extends JFrame implements ActionListener {

        private final int MINVAL = 0;
        private final int MAXVAL = 30;
        private final int INITVAL = 15;

        private JPanel panel = new JPanel(new BorderLayout());
        private JMenuBar menubar = new JMenuBar();
        private JMenu menu = new JMenu("File");
        private JMenuItem menuitem = new JMenuItem("Exit");;
        private JButton button = new JButton("Clear");
        private JLabel label = new JLabel("This is a label");
        private JRadioButton radiobutton = new JRadioButton("This is a radiobutton");
        private JSlider slider = new JSlider(JSlider.HORIZONTAL, MINVAL, MAXVAL, INITVAL);
        private JTextArea textarea = new JTextArea("This is textarea", 5, 20);
        private JTextField textfield = new JTextField();
                                                                                
        public SwingTest () {

            // close the window from windowmanager
            //addWindowListener(new WindowAdapter() {
            //    public void windowClosing(WindowEvent e) {
            //      System.exit(0);
            //    }
            //});

            Container contentPane = getContentPane();
            JPanel myPane = new JPanel();
            myPane.setLayout(new BoxLayout(myPane, BoxLayout.PAGE_AXIS));

            // set main window and menu
            this.setJMenuBar(menubar);
            menu.add(menuitem);
            menubar.add(menu);

            // set components
            slider.setMajorTickSpacing(10);
            slider.setMinorTickSpacing(1);
            slider.setPaintTicks(true);
            slider.setPaintLabels(true);
            slider.setPreferredSize(new Dimension(200,100));
            button.setPreferredSize(new Dimension(100,40));
            panel.setPreferredSize(new Dimension(200,100));
            textfield.setPreferredSize(new Dimension(100,20));
            
            // add listeners
            menuitem.addActionListener(this);
            button.addActionListener(this);

            // add components
            myPane.add(button);                                  
            myPane.add(label);
            myPane.add(radiobutton);
            myPane.add(slider);
            myPane.add(textarea);
            myPane.add(textfield);
            contentPane.add(myPane);
        }

        public void actionPerformed(ActionEvent e) {
              if (e.getSource() == menuitem) {
                  System.exit(0);
              }
              if (e.getSource() == button) {
                textarea.setText("");
              }
        }

        public static void main(String[] args) {
            SwingTest window = new SwingTest();
            window.setSize(640, 480);
            window.setTitle("Swing Test");
            try {
		//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
		//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
		UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            }
            catch (Exception e) {
              e.printStackTrace();
            }
            window.pack();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setVisible(true);
        }

}
4-3: Tee graafinen sovellus, joka esittelee graafisia hahmoja,
kirjasintyyppejä ja värejä. Esittelyn ei tarvitse olla mitenkään dynaaminen.
Riittää kun ruudulla näkyy viivoja, käppyröitä, yms. Kannattanee käyttää
luokan java.awt.Graphics2D palveluita?

import javax.swing.*;
import java.awt.*;

public class Pic extends JFrame {										
	
	public Pic() {	
	
		Container container = getContentPane();										
		container.setLayout(new GridLayout(2,2,0,0));				//Jaetaan ikkuna neljään osaan GridLayoutin mukaisesti
		
		JPanel p1 = new JPanel(new GridLayout(2,2,0,0));			//Luodaan neljä JPanel-oliota joille annetaan neljään osaan
		JPanel p2 = new JPanel(new GridLayout(2,2,0,0));			//jaettu GridLayout
		JPanel p3 = new JPanel(new GridLayout(2,2,0,0));
		JPanel p4 = new JPanel(new GridLayout(2,2,0,0));	
		
		p1.add(new RectEmpty());						//Piirretään tyhjä suorakaide
		p1.add(new RectFilled());						//Piirretään täytetty suorakaide
		p1.add(new Rect3D());							//Piirretään upotettu suuorakaide
		p1.add(new Rect3DRaised());						//Piirretään kohotettu suorakaide

		p2.add(new RectRoundEmpty());						//Piirretään tyhjä suorakaide jossa on pyöristetyt kulmat
		p2.add(new RectRoundFilled());						//Piirretään täytetty suorakaide jossa on pyöristetyt kulmat
		p2.add(new OvalEmpty());						//Piirretään soikio/ympyrä
		p2.add(new OvalFilled());						//Piirretää täytetty soikio/pallo
		
		p3.add(new ArcEmpty());							//Piirretään kaari
		p3.add(new ArcFilled());						//Piirretään kaari täytöllä
		p3.add(new DrawLine());							//Piirretään viiva
		p3.add(new DrawMultipleLine());						//Piirretään enemmänkin viivoja
		
		p4.add(new RectEmpty());
		p4.add(new RectFilled());
		p4.add(new Rect3D());
		p4.add(new Rect3DRaised());
											//Lisätään paneelit ikkunan layoutiin
		container.add(p1);
		container.add(p2);
		container.add(p3);
		container.add(p4);			
	}
	
	public static void main(String[] args) {
		Pic gui = new Pic();							//Luodaan graafinen käyttöliittymä	
		gui.setSize(450, 450);							//Asetetaan ikkunan kooksi 450 x 450																			
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();	//Selvitetään ruudun koko		
		int screenWidth = screenSize.width;					//Ruudun leveys						
		int screenHeight = screenSize.height;					//Ruudun korkeus					
		
		Dimension frameSize = gui.getSize();									
		int x = (screenWidth - frameSize.width)/2;				//Lasketaan ikkunan vasemman yläkulman sijainti.					
		int y = (screenHeight - frameSize.height)/2;							
		
		gui.setTitle("Ikkunan nimi");						//Annetaan ikkunalle nimi						
		gui.setLocation(x, y);							//Asetetaan ikkuna keskelle ruutua						
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			//Ikkunan sulkemisoperaatio				
		gui.setVisible(true);							//Asetetaan ikkuna näkyväksi									
	}
}

class RectEmpty extends JPanel {							//Luodaan tyhjä suorakaide
	public void paintComponent(Graphics g) {					
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.red);							//Asetataan suorakaiteen väriksi punainen
		g.drawRect(0, 0, 100, 100);						//Luodaan suorakaide jonka koko on 100 x 100
	}	
	public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Asetetaan RectEmpty-olio vaatimaan tilaa 100 x 100 pikseliä
	}
}

class RectFilled extends JPanel {							//Luodaan väritetty suorakaide
	public void paintComponent(Graphics g) {			
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.green);						//Asetetaan suorakaiteen väriksi vihreä
		g.fillRect(0, 0, 100, 100);						//Luodaan 100 x 100 kokoinen täytetty suorakaide
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan RectFilled-oliolle tilaa 100 x 100 pikseliä
	}
}

class Rect3D extends JPanel {								//Luodaan upotettu kolmiuloitteinen suorakaide
	public void paintComponent(Graphics g) {						
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.cyan);							//Asetetaan suorakaiteen väriksi cyan
		g.fill3DRect(0, 0, 100, 100, false);					//Luodaan 100 x 100 kokoinen täytetty suorakaide, joka on upotettu
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan Rect3D-oliolle tilaa 100 x 100 pikseliä
	}
}

class Rect3DRaised extends JPanel {							//Luodaan kohotettu kolmiuloitteinen suorakaide		
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.cyan);							//Asetetaan suorakaiteen väriksi cyan
		g.fill3DRect(0, 0, 100, 100, true);					//Luodaan 100 x 100 kokoinen täytetty suorakaide, joka on kohotettu
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan Rect3DRaised-oliolle tilaa 100 x 100 pikseliä
	}
}
class RectRoundEmpty extends JPanel {							//Luodaan tyhjä suorakaide jossa on pyöristetyt kulmat
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.red);							//Asetetaan suorakaiteen väriksi punainen
		g.drawRoundRect(0,0,100,100,20,20);					//Luodaan 100 x 100 kokoinen suorakaide, pyöristyksiin käytetään tilaa 20 x 20 pikseliä
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan suorakaiteelle tilaa 100 x 100 pikseliä
	}
}
class RectRoundFilled extends JPanel {							//Luodaan täytetty suorakaide jossa on pyöristetyt kulmat
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.green);						//Asetetaan suorakaiteen väriksi vihreä
		g.fillRoundRect(0, 0, 100, 100, 20, 20);				//Luodaan 100 x 100 kokoinen suorakaide, pyöristyksiin käytetään tilaa 20 x 20 pikseliä
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan suorakaiteelle tilaa 100 x 100 pikseliä
	}
}
class OvalEmpty extends JPanel {							//Luodaan tyhjä soikio
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.cyan);							//Asetetaan väriksi cyan
		g.drawOval(0, 0, 100, 100);						//Määritetään korkeus 100 ja leveys 100 pikseliä
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan piirrokselle tila 100 x 100 pikseliä
	}
}
class ArcFilled extends JPanel {							//Piirretään täytetty kaari
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.cyan);							//Asetetaan väriksi cyan
		g.fillArc(0, 0, 100, 100, 90, 110);					//Määritetään korkeus 100 ja leveys 100 pikseliä
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan piirrokselle tila 100 x 100 pikseliä
	}
}
class ArcEmpty extends JPanel {								//Luodaan tyhjä kaari
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.black);						//Asetetaan väriksi musta
		g.drawArc(0, 0, 100, 100, 270, 180);					//Määritetään korkeus 100 ja leveys 100 pikseliä
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan piirrokselle tila 100 x 100 pikseliä
	}
}
class DrawLine extends JPanel {								//Luodaan viiva
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.black);						//Asetetaan väriksi musta
		g.drawLine(3, 4, 95, 90);
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan piirrokselle tila 100 x 100 pikseliä
	}
}
class DrawMultipleLine extends JPanel {							//Luodaan useita viivoja
	public void paintComponent(Graphics g) {
		super.paintComponent(g);						//Korvataan yliluokan metodi paintComponent()
		g.setColor(Color.black);						//Asetetaan väriksi musta
		g.drawLine(0, 0, 100, 90);
		g.drawLine(0, 20, 95, 100);
		g.drawLine(13, 14, 85, 90);
		g.drawLine(56, 4, 0, 15);
		g.drawLine(0, 90, 100, 9);
	}
		public Dimension getPreferredSize() {
		return new Dimension(100, 100);						//Annetaan piirrokselle tila 100 x 100 pikseliä
	}
}


4-b: Esittele lyhyesti esimerkkien avulla kuvioiden piirtelyn ja tekstien
kirjoittamisen perusideoita (viivoja, ympyröitä, yms., tekstejä, erilaisia
tekstityyppejä, jne.; tässä tehtävässä ei ole tarkoitus esitellä, miten
esim. valmiita jpg-kuvia näytetään). Anna yksinkertaisia mutta valaisevia ja
toimivia ohjelmaesimerkkejä. Toiko Javan versio 1.5 joitakin muutoksia
näihin asioihin?

import javax.swing.*;
import java.awt.*;

public class Components extends JFrame {

	public Components() {
		Container container = getContentPane();			
		container.setLayout(new GridLayout(4,4,4,4));				//Jaetaan ikkuna 16 osaan GridLayoutin mukaisesti
		
		this.setJMenuBar(luoMenu());						//Kutsutaan metodia joka luo valikon
				
		container.add(new JButton("OK"));					//Lisätään painonappi
		container.add(new JToggleButton("On/Off"));				//Lisätään pohjaan jäävä painonappi
		container.add(new JTextField("JTextField"));				//Lisätään tekstikenttä
		container.add(new JPasswordField("JPasswordField"));			//Lisätään salasanakenttä
		container.add(new JTextArea("JTextArea"));				//Lisätään alue johon voi kirjoittaa tekstiä
		container.add(new JLabel("JLabel"));					//Lisätään "otsikko"
		container.add(skrollattavaLista());					//Kutsutaan metodia, joka luo skrollattavan listan
		container.add(luoSlider('x', 0, 50, 10));				//Kutsutaan metodia, joka tekee horisontaalisen liukupalkin
		container.add(luoSlider('y', 0, 20, 0));				//Kutsutaan metodia, joka tekee vertikaalisen liukupalkin
		container.add(luoComboBox());						//Kutsutaan metodia, joka luo ns. drop-down listan
		container.add(luoJPanel());						//Kutsutaan metodia, joka luo paneeleja
		
	}
	
	public static void main(String[] args) {					//Päämetodi
		Components comp = new Components();					//Luodaan ilmentymä itsestä
		comp.pack();								//Annetaan ikkunalle järkevä koko
		comp.setVisible(true);							//Tehdään ikkuna näkyväksi
		comp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			//Lopetetaan ohjelma kun ikkuna suljetaan	
	}
	
	public JPanel luoJPanel() {				//Luodaan paneeleja
		JPanel p1 = new JPanel();				
		JPanel p2 = new JPanel();
		JPanel p3 = new JPanel();
		JPanel p4 = new JPanel();
		JPanel p5 = new JPanel();
		
		p1.setLayout(new BorderLayout());		//Asetataan paneelille 1 BorderLayout
		p1.add(p2, BorderLayout.NORTH);			//Sijoitetaan paneeli 2 paneelin yksi sisään ylimmäksi
		p1.add(p3, BorderLayout.CENTER);		//Sijoitetaan paneeli 3 paneelin 1 sisään edellisen alapuolelle
		
		p2.setLayout(new BorderLayout());		//Asetataan paneelille 2 BorderLayout
		p2.add(p4, BorderLayout.EAST);			//Asetetaan paneeli 4 paneeliin 2 vasemmalle puolelle
		p2.add(p5, BorderLayout.CENTER);		//Asetetaan paneeli 5 paneeliin 2 edellisen oikealle puolelle
		
	
		p3.add(skrollattavaLista());			//Asetetaan paneeliin 3 skrollattava lista
		p3.setBackground(Color.blue);			//Paneelin 3 taustaväri on sininen
	
		p4.add(luoComboBox());				//Paneeliin 4 luodaan drop-down lista
		p4.setBackground(Color.green);			//Taustaväri on vihreä
		
		p5.add(new JLabel("JLabel"));			//Paneeliin viisi sijoitetaan otsikko
		p5.setBackground(Color.yellow);			//Taustaväriksi keltainen
		
		return p1;
	}
	
	public JComboBox luoComboBox() {	//Luodaan drop-down lista alla olevista vaihtoehdoista
		String[] lista = {"Combo Box lista", "valinta 2", "valinta 3", "valinta 4", "valinta 5", "valinta 6", "valinta 7", "valinta 8"};
		JComboBox comboBox = new JComboBox(lista);
		comboBox.setSelectedIndex(0);
		return comboBox;		//Palautetaan luotu drop-down lista
	}
	
	
	public JSlider luoSlider(char x, int min, int max, int init) {			//Luodaan liukupalkki
		JSlider slider;
		if (x == 'x') {
			slider = new JSlider(JSlider.HORIZONTAL, min, max, init);	//Vaakatasoon
		}
		else {
			slider = new JSlider(JSlider.VERTICAL, min, max, init);		//Pystytasoon
		}
		slider.setMajorTickSpacing(10);						//Asetetaan väliarvot 10 yksikön välein
		slider.setMinorTickSpacing(1);						//Asetetaan pienet väliarvot 1 yksikön välein
		slider.setPaintTicks(true);
		slider.setPaintLabels(true);
		return slider;								//Palautetaan liukupalkki
	}	
	
	public JMenuBar luoMenu() {							//Luodaan valikko
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("JMenu menu");			
		JMenu submenu = new JMenu("JMenu submenu");
		JMenu anotherSubmenu = new JMenu("JMenu anotherSubmenu");
		JMenuItem item1 = new JMenuItem("JMenuItem item1");
		
		JCheckBoxMenuItem item2 = new JCheckBoxMenuItem("JCheckBoxMenuItem item2");		//Luodaan valikko checkbox-valinnalla
		JCheckBoxMenuItem item3 = new JCheckBoxMenuItem("JCheckBoxMenuItem item3");
		item3.setSelected(true);
		
		ButtonGroup group = new ButtonGroup();							
		JRadioButtonMenuItem item4 = new JRadioButtonMenuItem("JRadioButtonMenuItem item4");	//Luodaan valikko radiobutton-valinnalla
		JRadioButtonMenuItem item5 = new JRadioButtonMenuItem("JRadioButtonMenuItem item5");
		JRadioButtonMenuItem item6 = new JRadioButtonMenuItem("JRadioButtonMenuItem item6");
		item4.setSelected(true);
		group.add(item4);
		group.add(item5);
		group.add(item6);
		
		menuBar.add(menu); 			//Lisätään valikko yläpalkkiin
		menu.add(item1);			//Lisätään valinta valikkoon
		menu.add(submenu);			//Lisätään alavalikko
		submenu.add(item2);			//Alavalikkoon checkbox-valinta
		submenu.add(item3);
		menu.add(anotherSubmenu);		//Lisätään toinen alavalikko
		anotherSubmenu.add(item4);		//Lisätään alavalikkoon radiobutton-valinta
		anotherSubmenu.add(item5);
		anotherSubmenu.add(item6);
	
		return menuBar;				//Palautetaan luotu valikko
	}
	
	public JScrollPane skrollattavaLista() {					//Luodaan skrollattava paneeli
		DefaultListModel listModel = new DefaultListModel();
		for (int i = 1; i < 20; i++)						//Asetetaan valikkoon 19 valintaa
			listModel.addElement("Valinta "+i);
		JList list = new JList(listModel);					//Luodaan lista
		list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);	//Sallitaan vain yksi aktiivinen valinta
		list.setVisibleRowCount(-1);
		list.setSelectedIndex(4);						//Neljäs valinta on valittu oletusarvoisesti
		JScrollPane listScroller = new JScrollPane(list);
		listScroller.setPreferredSize(new Dimension(250, 80));			//Annetaan valikolle tilaa 250 x 80 pikseliä
		return listScroller;							//Palautetaan lista
	}
}



4-c:  Selitä miten graafisen käyttöliittymän komponentteja voidaan asemoida
(kyseessä on siis lay-out). Millaisia layout-managereita Javassa on? Anna
yksinkertaisia mutta valaisevia ja toimivia ohjelmaesimerkkejä. Miten eri
layout-managerit reagoivat ikkunan koon muuttamiseen? Miten eri
layout-managereilla voidaan toteuttaa ikkuna, jonka koon kasvaessa jotkin
komponentit suurenevat, mutta jotkin - esimerkiksi painikkeet - eivät? Toiko
Javan versio 1.5 joitakin muutoksia asemoinnin välineisiin?

Javassa on seitsemän erilaista layout-manageria, jotka eroavat toiminnaltaan. Oletuksena JPaneleihin liittyen on päällä FlowLayout-niminen manageri, joka asettaa komponentit yhdelle tai useammalle riville komponenttien preferredSize-asetusten mukaisesti. Muita layout-managereita ovat:

- FlowLayout

import javax.swing.*;
import java.awt.*;

public class GuiLuokkaFlow extends JFrame {								//Tämä luokka on JFrame-luokan "laajennos"
	
	public GuiLuokkaFlow() {									//Konstruktori
		Container container = getContentPane();							//Luodaan Container-olio
		container.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 15));				//Asetetaan Container-olion layoutiksi FlowLayout
		for (int i = 0; i < 10; i++) 								//Tehdään kymmenen painonappia
			container.add(new JButton("Component " + i));					//Luo ikkunaan painonapin
	}
	
	public static void main(String[] args) {
		GuiLuokkaFlow gui = new GuiLuokkaFlow();						//Luo uuden ikkunan
		gui.setSize(200, 200);									//Asettaa ikkunalle koon													
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();			//Hakee ruudun koon Dimension-olioon screenSize
		int screenWidth = screenSize.width;							//Hakee ruudun leveyden Dimension-oliosta screenSize int-tyyppiseen muuttujaan
		int screenHeight = screenSize.height;							//Hakee ruudun korkeuden Dimension-oliosta screenSize int-tyyppiseen muuttujaan
		
		Dimension frameSize = gui.getSize();							//Hakee ikkunan koon Dimension-olioon frameSize
		int x = (screenWidth - frameSize.width)/2;						//Vähentää ruudun leveydestä ikkunan leveyden ja erotuksena saa ikkunan vasemman yläkulman paikan vaakasuunnassa
		int y = (screenHeight - frameSize.height)/2;						//Vähentää ruudun korkeudesta ikkunan korkeuden ja erotuksena saa ikkunan vasemman yläkulman paikan pystysuunnassa
		
		gui.setTitle("Ikkunan nimi");								//Asettaa ikkunalle nimen
		gui.setLocation(x, y);									//Asettaa ikkunan vasemman yläkulman paikaksi x:n ja y:n.
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);					//Tappaa ohjelman suorituksen kun ikkuna suljetaan
		gui.setVisible(true);									//Tekee ikkunan näkyväksi
	}
}

- GridLayout
import javax.swing.*;
import java.awt.*;

public class GuiLuokkaGrid extends JFrame {							//Tämä luokka on JFrame-luokan "laajennos"
	
	public GuiLuokkaGrid() {								//Konstruktori
		Container container = getContentPane();						//Luodaan Container-olio
		container.setLayout(new GridLayout(4, 3, 5, 5));				//Asetetaan Container-olion layoutiksi FlowLayout
		for (int i = 0; i < 10; i++) 							//Tehdään kymmenen painonappia
			container.add(new JButton("Component " + i));				//Luo ikkunaan painonapin
	}
	
	public static void main(String[] args) {
		GuiLuokkaGrid gui = new GuiLuokkaGrid();					//Luo uuden ikkunan
		gui.setSize(200, 200);								//Asettaa ikkunalle koon													
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();		//Hakee ruudun koon Dimension-olioon screenSize
		int screenWidth = screenSize.width;						//Hakee ruudun leveyden Dimension-oliosta screenSize int-tyyppiseen muuttujaan
		int screenHeight = screenSize.height;						//Hakee ruudun korkeuden Dimension-oliosta screenSize int-tyyppiseen muuttujaan
		
		Dimension frameSize = gui.getSize();						//Hakee ikkunan koon Dimension-olioon frameSize
		int x = (screenWidth - frameSize.width)/2;					//Vähentää ruudun leveydestä ikkunan leveyden ja erotuksena saa ikkunan vasemman yläkulman paikan vaakasuunnassa
		int y = (screenHeight - frameSize.height)/2;					//Vähentää ruudun korkeudesta ikkunan korkeuden ja erotuksena saa ikkunan vasemman yläkulman paikan pystysuunnassa
		
		gui.setTitle("Ikkunan nimi");							//Asettaa ikkunalle nimen
		gui.setLocation(x, y);								//Asettaa ikkunan vasemman yläkulman paikaksi x:n ja y:n.
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);				//Tappaa ohjelman suorituksen kun ikkuna suljetaan
		gui.setVisible(true);								//Tekee ikkunan näkyväksi
	}
}

- BorderLayout mahdollistaa komponenttien asettamisen ilmansuuntien ja muutaman muun tunnuksen perusteella eri kohtiin paneelia. Ilmansuuntia ovat esim. NORTH, SOUTH ja muita tunnuksia PAGE_START, LINE_START, jne.


import javax.swing.*;
import java.awt.*;

public class GuiLuokkaBorder extends JFrame {

	public GuiLuokkaBorder() {
		Container container = getContentPane();
		container.setLayout(new BorderLayout(5, 10));
		container.add(new JButton("East"), BorderLayout.EAST);
		container.add(new JButton("South"), BorderLayout.SOUTH);
		container.add(new JButton("West"), BorderLayout.WEST);
		container.add(new JButton("North"), BorderLayout.NORTH);
		container.add(new JButton("Center"), BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		GuiLuokkaBorder gui = new GuiLuokkaBorder();
		gui.setTitle("BorderLayout");
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.setSize(300,300);
		gui.setVisible(true);
	}
}


- BoxLayoutilla komponentit saa joko päällekkäin tai riveille.

- CardLayoutilla voi nimensä mukaisesti hallita useaa samassa ikkunatilassa näytettävää JPanelia, joiden välillä käyttäjän on mahdollista navigoida.

- GridBagLayout on joustavin, mutta samalla monimutkaisin tarjolla oleva layout manageri. Se mahdollistaa komponenttien sijoittelun riveillä ja sarakkeilla sijaitseviin soluihin.

- SpringLayout lisättiin Javan versioon 1.4 tukemaan graafisten sovelluskehittimien tarpeita.