- 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.