Java Swing - TUTgrako/2008/luennot/swing_2008.pdf · Java Swing “The Swing toolkit ... JTable,...

Post on 10-Apr-2018

263 views 1 download

Transcript of Java Swing - TUTgrako/2008/luennot/swing_2008.pdf · Java Swing “The Swing toolkit ... JTable,...

Java Swing

Juha Järvensivujuha.jarvensivu@tut.fi

2008

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.

Eclipse

• Graafinen kehitystyökalu Java-sovelluksille

• www.eclipse.org

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