Sisällys
• Java ympäristöt• Java kirjastot
– Java Foundation Classes (JFC)• Hello Java• Swing-kirjasto• Grafiikan piirto• Tapahtumankäsittely
Java ympäristö
• J2ME (Java Platform, microedition)– Mobiilisovellukset
• J2SE (Java Platform, standard edition)– Työpöytäsovellukset
• J2EE (Java Platform, enterprise edition)– Web ja palvelin-sovellukset (Web Service,
Java Servlet, Java Beans…)
Javan versionti
• Java JDK 1.0• Java JDK 1.1• Java JDK 1.2 Java 2 SDK 1.2• Java 2 SDK 1.3• Java 2 SDK 1.4• Java 2 SDK 1.5 Java 2 JDK 5.0• Java SE 6 (Java standard edition SDK)
JDK vs JRE
• JRE (Java Runtime Environment)– Sisältää Java virtuaalikoneen ja muut
sovellusten ajamiseen tarvittavat komponentit– Ei sisällä sovelluskehitykseen tarvittavia
työkaluja• JDK (Java Development Kit)
– Sisältää Java virtuaalikoneen ja muut JRE:nmukana tulevat komponetit
– Sisältää lisäksi sovelluskehitykseen tarvittavattyökalut kuten kääntäjä, debuggeri, jne.
Java Platform (J2SE)
Java Platform (J2SE)
Java Foundation Classes (JFC)• Abstract Window Toolkit (AWT) - APIs that enable programs to
integrate into the native desktop window system, including APIs forDrag and Drop.
• Java 2D - APIs to enable advanced 2D graphics, imaging, text andprinting.
• Swing GUI Components - APIs that extend the AWT to provide arich, extensible GUI component library with a pluggable look andfeel.
• Accessibility - APIs and assistive technologies are for ensuring anapplication is accessible to users with disabilities and meetsgovernment requirements for accessibility.
• Internationalization - All JFC technologies include support forcreating applications that can interact with users around the worldusing the user's own language and cultural conventions. Thisincludes the Input Method Framework API.
Lähde: http://java.sun.com/products/jfc/overview.html#1
Abstract Window Tookit (AWT)“The java.awt package contains the base-level
APIs that allow Java applications to interact withthe native window system on each platform.”
“These APIs include support for creating andmanaging windows (discrete areas on thedisplay), getting input events, and renderingsimple graphics. The AWT also includes a set ofsimple GUI components that map directly to thenative widget counterparts on the givenplatform.“
Lähde: http://java.sun.com/products/jfc/overview.html#1
Java Swing“The Swing toolkit is a fully-featured UI component
library implemented entirely in the Javaprogramming language.”
“The J2SE platform's javax.swing package usesthe windowing functionality of AWT and therendering capabilities of the Java 2D API toprovide sophisticated and highly extensible UIcomponents that comply with the JavaBeansspecification.”
Lähde: http://java.sun.com/products/jfc/overview.html#1
Heavyweight component
• Komponteillanatiivitoteutus
• Varaavat omanikkunaresurssin
• Uusien komponenttienperiyttäminenhankalaa
Lightweight component
• Komponentittoteutettu javalla
• Käyttävätisäntäkomponentinikkunaresurssia
• Uusien komponenttientoteuttaminen helppoa
AWT vs SWING
• AWT– Heavyweight
komponentteja– Ikkunat aina
suorakulmionmuotoisia
– Komponentit erinäköisiä eriympäristöissä
– Natiivitoteutus
• SWING– Lightweight
komponentteja– Tuki läpinäkyville
pikseleille– Pluggable look and
feel– Java-toteutus
Älä käytä samassa sovelluksessa sekaisin AWT (esim Button)ja SWING (esim JButton) komponentteja!
Awt-Swing• Swing on toteutettu AWT:n päälle ja se käyttää toteutuksessaan
AWT:n luokkia (Esim Graphics, MouseListener jne)• Swing ja AWT UI-komponentit toteutettu eri tavalla, joten ne eivät
sovellu käytettäväksi samassa ohjelmassa vaan on valittavakumpaa kirjastoa käyttää!
• Swing komponentit tunnistaa J-kirjaimesta nimen alussa (EsimJButton)
Heavyweight vs lightweightcomponent
Java Swing – UI components
JFrame, JDialog, JWindow, JInternalFrame,JApplet
Top-level window components
JPanel, JScrollPane, JSplitPane,JTabbedPane, JDesktopPane, JToolBar
Layout containers
JMenuBar, JMenu, JPopupMenu, JMenuItem,JCheckboxMenuItem, JRadioButtonMenuItem
Menu components
JTextField, JFormattedTextField,JPasswordField, JTextArea, JTextPane,JEditorPane
Text components
JTable, JTree, JList, JFileChooser,JColorChooser, JOptionPane
Complex data components
JLabel, JButton, JCheckBox, JRadioButton,JToggleButton, JComboBox, JScrollBar,JSeparator, JSlider, JSpinner, JProgressBar
Atomic controls
Pluggable look and feel• Native Windows Look and Feel
– Supported on Microsoftwindows only
• Native Mac Look and Feel– Supported on Mac only
• Java Look and Feel– Supported on all platforms
• Motif Look and feel– Supported on all platforms
Hello.java (CLI)/*** The HelloWorldApp class implements an application that* simply prints "Hello World!" to standard output.*/
class HelloWorldApp{
public static void main(String[] args){
System.out.println("Hello World!");}
}
Sovelluksen kääntäminen jaajaminen
// LähdekooditiedostoHelloWorldApp.java// Käännetään lähdekoodi tavukoodiksijavac HelloWorldApp.java// Käännetty tavukooditiedostoHelloWorldApp.class// Käynnistetään sovellusjava HelloWorldApp
Hello.java (GUI)import javax.swing.*;public class HelloWorldSwing {
private static void createAndShowGUI() {JFrame.setDefaultLookAndFeelDecorated(true);JFrame frame = new JFrame("HelloWorldSwing");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JLabel label = new JLabel("Hello World");frame.getContentPane().add(label);frame.pack();frame.setVisible(true);
}public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() { createAndShowGUI(); }
}}
}
Swing-kirjasto• javax.swing
– Sisältää käyttöliittymäkomponentit– JButton, JLabel, JTextField, JFrame jne.
• javax.swing.event– Tapahtumaluokat
• ActionEvent, KeyEvent, MouseEvent jne.– Rajapintaluokat
• ActionListener, KeyListener, MouseListener jne.– Adapteriluokat
• KeyAdapter, MouseAdapter, WindowAdapter
• javax.swing.plaf– Sisältää LookAndFeel toiminnallisuuden tarvitsemia luokkia
Swing-kirjasto
• java.awt.Graphics– Grafiikan piirton tarvittava luokka
• java.awt.Graphics.Graphics2D– Sisältää monipuolisempia piirtometodeja
• java.awt.geom– Sisältää geometrisia muotoja– Ellipse2D, Rectangle2D, Line2D
JComponent
• Lightweight-komponenttien kantaluokka• Esim JButton
JComponent
AbstractButton
JButton JToggleButton
JCheckBox JRadioButton
Koosteoliot (Container)
• Javassa UI-komponentit lisätään Container-oliohin (vrt. .NET ja absoluuttiset koordinaatit)
• Komponenttien sijainti näytöllä riippuu käytetystäLayout-managerista
• JPanel– lightweight-komponenttien koosteolio
Container
Container LayoutManager
Component Component Component
FlowLayout
• Yksinkertaisin layoutmanageri• Asettelee komponentit järjestyksessä
vasemmalta oikealle ja ylhäältä alas• JPanel-luokka käyttää oletuksena• Käyttää komponenttien piirtoon niille
määritettyä oletuskokoa (preferredSize)
Comp1 Comp2 Comp3 Comp4Comp5 Comp6
BorderLayout
• Jakaa ikkunan viiteen alueeseen• Ikkunaa suurennettaessa CENTER-alueen
komponentti kasvaa• Oletuksena ContentPane-komponentilla
CENTER LINE_ENDLINE_START
PAGE_START
PAGE_END
GridLayout• Kaikki komponentit ovat saman kokoisia• Ikkunan koon muutos muuttaa myös komponenttien kokoja• Komponentit lisätään oletuksena rivi kerrallaan vasemmalta oikealle
http://java.sun.com/docs/books/tutorial/uiswing/layout/grid.html
GridBagLayout
GridBagLayout
Top-level container• JFrame• JDialog• JInternalFrame
JFrame layers
JFrame layers• Root Pane (Juuriruutu)
– Osat: Glass pane, Layeredpane
– Ei yleensä tarvitse käsitelläsuoraan ohjelmakoodissa
• Layered Pane (Kerrosruutu)– Container– Asettaa komponentit eri
tasoihin (esim raahatavakomponentti piirretäänpäälimmäiseksi)
– Osat: MenuBar ja Content pane
JFrame layers• Content Pane (Sisältöruuutu)
– Container– Sisältää UI-komponentit
• GlassPane (Lasiruutu)– Component– Läpinäkyvä ”päälimmäinen” kerros– Mahdollisuus estää tapahtumien pääsy säiliön komponenteille
frame.getContentPane().add(yellowLabel,BorderLayout.CENTER);
Grafiikan piirto
• java.awt.Graphics– abstrakti kantaluokka, joka sisältää grafiikan
piirtoon tarvittavat metodit• java.awt.Graphics2D
– Toteuttaa monimutkaisemmat grafiikan jatekstin piirtoon tarvittavat funktiot
– Esim• void rotate(double theta)• void scale(double sx, double sy)• void translate(int x, int y)
Ikkunan päivittäminen
• Ikkunan piirtofunktiovoid paint(Graphics g)
• Ikkunan päivittäminen ohjelmallisestivoid repaint()void repaint(int x, int y, int w, int h)
Esimerkki paint-metodistaimport javax.swing.*;import java.awt.*;
public class hello extends JPanel{
public hello(){
setPreferredSize(new Dimension(300,300));}
public void paint(Graphics g){
super.paint(g);g.setColor(Color.BLUE);Shape s = g.getClip();g.setClip(120,120,100,100);g.fillOval(20,20,200,200);g.setClip(s);
}}
Piirtojärjestys
Tapahtumakäsittely
public interface MouseListener{
void mouseClicked(MouseEvent e);void mouseEntered(MouseEvent e);void mouseExited(MouseEvent e);void mousePressed(MouseEvent e);void mouseReleased(MouseEvent e);
}
public interface MouseMotionListener{
void mouseDragged(MouseEvent e);void mouseMoved(MouseEvent e);
}
Tapahtumankäsittely on toteutettu javassa rajapintaluokkien avulla
public class MouseEvent{
int getButton();int getClickCount();Point getPoint();int getX();int getY();
}
Hiiritapahtumatimport javax.swing.*;import java.awt.*;import java.awt.event.*; // Otetaan uusi kirjasto käyttöön
public class hello extends JPanelimplements MouseListener {
private int x;private int y;
public hello() {// Rekisteröidään olio kuuntelemaan hiiritapahtumiaaddMouseListener(this);
}
// Tyhjät toteutukset niille funktiolle, joita ei käytetäpublic void mouseClicked(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}
// Toteutetaan tapahtumankäsittelijä, joka ottaa talteen klikkauspisteen// koordinaatit ja päivittää ikkunan uudelleenpublic void mousePressed(MouseEvent e) {
x = e.getX();y = e.getY();repaint();
}}
Adapteriluokat
import javax.swing.*;import java.awt.*;import java.awt.event.*;
public class hello extends JPanelprivate int x;private int y;
public hello() {// Luodaan olio ja rekisteröidään se kuuntelemaan hiiritapahtumiaaddMouseListener( new MouseHandler() );
}
// Sisäinen luokka ja peritään se MouseListener rajapinnan// toteuttavasta MouseAdapter luokasta.public class MouseHandler extends MouseAdapter {
public void mousePressed(MouseEvent e) {x = e.getX();y = e.getY();repaint();
}}
}
Antaa rajapintafunktioille tyhjät toteutukset
Adapteriluokat
ActionListenerKeyAdapterKeyListener
WindowFocusListenerWindowStateListener
WindowAdpaterWindowListenerMouseWheelListener
MouseMotionAdapterMouseMotionListenerMouseAdapterMouseListenerAdapteriRajapinta
Action
Action
Actionpublic class ActionDemo extends JPanel {
protected Action firstAction;protected JMenuItem item;protected JButton btn;
public ActionDemo() {firstAction = new FirstAction(”Toiminnon nimi”, icon);
item = new JMenuItem();item.setAction(firstAction);
btn = new JButton();btn.setAction(firstAction);
}
public class FirstAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {setEnabled(false);
}}
NäppäintapahtumatVoidaan toteuttaa Action-olioiden sekä InputMap ja ActionMap luokkien avulla
public class ActionDemo extends JPanel {
public ActionDemo() {InputMap im = getInputMap();ActionMap am = getActionMap();
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_1,0);im.put(ks, “1");
am.put( new KeyAction(), “1");}
public class KeyAction extends AbstractAction {public void actionPerformed(ActionEvent e) {
// Näppäinkäsittelijän toteutus tänne…}
}
Dokumentaatio
• The Swing tutorial– http://java.sun.com/docs/books/tutorial/uiswin
g/TOC.html• Java API
– http://java.sun.com/j2se/1.5.0/docs/api/
Lähteitä• Java AWT
– http://java.sun.com/j2se/1.5.0/docs/guide/awt/– http://en.wikipedia.org/wiki/Abstract_Window_Toolkit
• Java Swing– http://java.sun.com/j2se/1.5.0/docs/guide/swing/– http://en.wikipedia.org/wiki/Swing_(Java)
• The Swing tutorial– http://java.sun.com/docs/books/tutorial/uiswing/TOC.html
• Sun java– http://java.sun.com/
• JavaWorld– http://www.javaworld.com/
• How to use actions– http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html