Java Swing Juha Järvensivu juha.jarvensivu@tut.fi 2007
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
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:n mukana tulevat komponetit Sisältää lisäksi sovelluskehitykseen tarvittavat työkalut kuten kääntäjä, debuggeri, jne.
Eclipse Graafinen kehitystyökalu Javasovelluksille 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 for Drag and Drop. Java 2D - APIs to enable advanced 2D graphics, imaging, text and printing. Swing GUI Components - APIs that extend the AWT to provide a rich, extensible GUI component library with a pluggable look and feel. Accessibility - APIs and assistive technologies are for ensuring an application is accessible to users with disabilities and meets government requirements for accessibility. Internationalization - All JFC technologies include support for creating applications that can interact with users around the world using the user's own language and cultural conventions. This includes 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 with the native window system on each platform. These APIs include support for creating and managing windows (discrete areas on the display), getting input events, and rendering simple graphics. The AWT also includes a set of simple GUI components that map directly to the native widget counterparts on the given platform. 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 Java programming language. The J2SE platform's javax.swing package uses the windowing functionality of AWT and the rendering capabilities of the Java 2D API to provide sophisticated and highly extensible UI components that comply with the JavaBeans specification. Lähde: http://java.sun.com/products/jfc/overview.html#1
Heavyweight component Komponteilla natiivitoteutus Varaavat oman ikkunaresurssin Uusien komponenttien periyttäminen hankalaa
Lightweight component Komponentit toteutettu javalla Käyttävät isäntäkomponentin ikkunaresurssia Uusien komponenttien toteuttaminen helppoa
AWT vs SWING AWT Heavyweight komponentteja Ikkunat aina suorakulmion muotoisia Komponentit eri näköisiä eri ympä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 valittava kumpaa kirjastoa käyttää! Swing komponentit tunnistaa J-kirjaimesta nimen alussa (Esim JButton)
Heavyweight vs lightweight component
Java Swing UI components Atomic controls Complex data components Text components Menu components Layout containers Top-level window components JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JComboBox, JScrollBar, JSeparator, JSlider, JSpinner, JProgressBar JTable, JTree, JList, JFileChooser, JColorChooser, JOptionPane JTextField, JFormattedTextField, JPasswordField, JTextArea, JTextPane, JEditorPane JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem JPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane, JToolBar JFrame, JDialog, JWindow, JInternalFrame, JApplet
Pluggable look and feel Native Windows Look and Feel Supported on Microsoft windows 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 ja ajaminen // Lähdekooditiedosto HelloWorldApp.java // Käännetään lähdekoodi tavukoodiksi javac HelloWorldApp.java // Käännetty tavukooditiedosto HelloWorldApp.class // Käynnistetään sovellus java 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 Containeroliohin (vrt..net ja absoluuttiset koordinaatit) Komponenttien sijainti näytöllä riippuu käytetystä Layout-managerista JPanel lightweight-komponenttien koosteolio
JFrame JDialog JInternalFrame Top-level container
JFrame layers
JFrame layers Root Pane (Juuriruutu) Osat: Glass pane, Layered pane Ei yleensä tarvitse käsitellä suoraan ohjelmakoodissa Layered Pane (Kerrosruutu) Container Asettaa komponentit eri tasoihin (esim raahatava komponentti piirretään päälimmäiseksi) Osat: MenuBar ja Content pane
JFrame layers Content Pane (Sisältöruuutu) Container Sisältää UI-komponentit frame.getcontentpane().add(yellowlabel, BorderLayout.CENTER); GlassPane (Lasiruutu) Component Läpinäkyvä päälimmäinen kerros Mahdollisuus estää tapahtumien pääsy säiliön komponenteille
Grafiikan piirto java.awt.graphics abstrakti kantaluokka, joka sisältää grafiikan piirtoon tarvittavat metodit java.awt.graphics2d Toteuttaa monimutkaisemmat grafiikan ja tekstin 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 piirtofunktio void paint(graphics g) Ikkunan päivittäminen ohjelmallisesti void repaint() void repaint(int x, int y, int w, int h)
Esimerkki paint-metodista import 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 Tapahtumankäsittely on toteutettu javassa rajapintaluokkien avulla public interface MouseListener { void mouseclicked(mouseevent e); void mouseentered(mouseevent e); void mouseexited(mouseevent e); void mousepressed(mouseevent e); void mousereleased(mouseevent e); public class MouseEvent { int getbutton(); int getclickcount(); Point getpoint(); int getx(); int gety(); public interface MouseMotionListener { void mousedragged(mouseevent e); void mousemoved(mouseevent e);
Hiiritapahtumat import javax.swing.*; import java.awt.*; import java.awt.event.*; // Otetaan uusi kirjasto käyttöön public class hello extends JPanel implements MouseListener { private int x; private int y; public hello() { // Rekisteröidään olio kuuntelemaan hiiritapahtumia addmouselistener(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 uudelleen public void mousepressed(mouseevent e) { x = e.getx(); y = e.gety(); repaint();
Adapteriluokat Antaa rajapintafunktioille tyhjät toteutukset import javax.swing.*; import java.awt.*; import java.awt.event.*; public class hello extends JPanel private int x; private int y; public hello() { // Luodaan olio ja rekisteröidään se kuuntelemaan hiiritapahtumia addmouselistener( 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();
Adapteriluokat Rajapinta MouseListener MouseMotionListener MouseWheelListener WindowListener WindowStateListener WindowFocusListener KeyListener ActionListener Adapteri MouseAdapter MouseMotionAdapter WindowAdpater KeyAdapter
Action Action
public class ActionDemo extends JPanel { protected Action firstaction; protected JMenuItem item; protected JButton btn; Action 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äintapahtumat Voidaan 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