JAVA-OHJELMOINTI 3 op A274615 JFC & Swing, Look & Feel, Events Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi, 2004. JFC Java Foundation Classes JFC sisältää Swing GUI komponentit Look&Feel tuki Accessibility API helppokäyttöisyyden tuki (braillepistekirjoitus, screen reader) Java 2D API Drag&Drop tuki Kansainvälistäminen (Internationalization)
Swing-komponentit Swing API mukaan Java 2:ssa (jdk 1.2 ) Pakkaukset: javax.swing.* Kaikki Swing-komponentit alkavat (pääsääntöisesti) J-kirjaimella Komponentteja on paljon Periytyvät AWT-komponenteista Swing- ja AWT-komponentteja ei saa käyttää sekaisin Swing-komponentit Korkean tason säiliöt JApplet, JDialog, JFrame Yleiskäyttöiset säiliöt JPanel, JScrollPane, JSplitPane, JTabbedPane, JToolBar Erikoiskäyttöiset säiliöt JInternalFrame, JLayeredPane, JRootPane
Swing-komponentit Peruskontrollit JButton, JComboBox, JList, JMenu, JSlider, JSpinner, JTextField, JFormattedTextField, Informaation näyttöön tarkoitetut: JLabel, JProgressBar, JToolTip Interaktiiviset formatoidun tiedon näyttöön: JColorChooser, JFileChooser, JTable, JText, JTree Sunin Java-sivuilta löytyy visual index: http://java.sun.com/docs/books/tutorial/uiswing/components/components.html Yksinkertainen Swing-ohjelma HelloWorldSwing.java: import javax.swing.*; public class HelloWorldSwing { public HelloWorldSwing(){ // Luodaan pääikkuna. JFrame frame = new JFrame("HelloWorldSwing"); // Tehdään label, johon teksti laitetaan. JLabel label = new JLabel("Hello World"); // Lisätään label frameen. frame.getcontentpane().add(label); // Ikkunan sulkeutuessa ohjelma lopetetaan. frame.setdefaultcloseoperation(jframe.exit_on_close); // Pakataan frame ja laitetaan näkyviin. frame.pack(); frame.setvisible(true); public static void main(string[] args){ // Luodaan instanssi. HelloWorldSwing hws = new HelloWorldSwing(); pack()-metodin tilalla voisi käyttää myös setsize()-metodia. pack() on kuitenkin suositeltavampi, sillä se jättää vastuun koon määrittämisestä layout-managerille.
Yksinkertainen Swing-ohjelma säikeillä HelloWorldSwingTS.java: import javax.swing.*; public class HelloWorldSwingTS { private static void createandshowgui(){ // Luodaan pääikkuna. JFrame frame = new JFrame("HelloWorldSwing"); // Tehdään label, johon teksti laitetaan. JLabel label = new JLabel("Hello World"); // Lisätään label frameen. frame.getcontentpane().add(label); // Ikkunan sulkeutuessa ohjelma lopetetaan. frame.setdefaultcloseoperation(jframe.exit_on_close); // Pakataan frame ja laitetaan näkyviin. frame.pack(); frame.setvisible(true); public static void main(string[] args){ javax.swing.swingutilities.invokelater(new Runnable(){ public void run(){ createandshowgui(); ); Luodaan säie, joka kutsuu createandshowgui() metodia. Kaikki Swing-komponenttien piirtäminen ja tapahtumien käsittely tapahtuu yhdessä säikeessä. Tällä varmistetaan, ettei piirtäminen keskeydy jonkin tapahtuman lauetessa. Jotta vältetään deadlock :t, niin Swing-komponenttien luonti, päivitys ja käsittely pitää tehdä ko. tapahtumankäsittelijäsäikeessä. Oheista koodia voi käyttää sellaisenaan. Look & Feel Swing-ohjelmissa on mahdollista määrittää ns. Look & Feel eli miltä ohjelma näyttää ja tuntuu Jos ei ole määritelty koodissa, niin Java yrittää ensin etsiä käyttäjän asettamaa oletusarvoa ja jos sitäkään ei ole, niin käytetään Java-Look & Feeliä Ei tarvitse rajoittua vain Javan mukana tuleviin Look & Feel:hin Muita Look & Feel:jä saatavilla yleensä.jarpaketeissa Voidaan muuttaa myös ohjelman ajon aikana
Look & Feel Lisätään edelliseen ohjelmaan Javan default-look & Feel:... String lookandfeel = null; lookandfeel = UIManager.getCrossPlatformLookAndFeelClassName(); try { UIManager.setLookAndFeel(lookAndFeel); catch (Exception e) {... Yllä ikkunointijärjestelmältä pyydetään nimi look & feel:lle Tämän jälkeen asetetaan ko. look & feel Voidaan myös antaa suoraan: com.sun.java.swing.plaf.motif.motiflookandfeel com.sun.java.swing.plaf.gtk.gtklookandfeel Voidaan asettaa koodissa, swing.properties:ssa, komentorivillä Tapahtumienkäsittely Lisätään ensin toiminnallisuutta sisältävä komponentti ohjelmaan Painike Swingissä on siis JButton: // Luodaan painike. JButton button = new JButton( Click me! ); // Lisätään painike. frame.getcontentpane().add(button); Painike menee aikaisemmin lisätyn tekstin päälle, koska JFrame:lla ei ole määritelty asemoijaa (LayoutManager) Yksinkertainen yhden sarakkeen GridLayout: frame.setlayout(new GridLayout(0,1)); Tarvitaan myös import java.awt.*; Nyt painike ei siis vielä tee mitään ja sille pitää määrittää tapahtumankäsittelijä
Tapahtumienkäsittely Muokataan ensin koodia siten, että omassa metodissaan luodaan ensin JPanel, johon kaikki komponentit lisätään private Component createcomponents{ JPanel panel = new JPanel(new GridLayout(0,1)); JButton button = new JButton( Click Me! ); panel.add(button); return panel; Tämä JPanel laitetaan sitten pääikkuna-frameen Huom. static metodeissa ei siis voi kutsua suoraan luokan non-static metodeja pitää siis luoda olio ja kutsua olion metodia Tapahtumienkäsittely Jotta tapahtumankäsittelijää voisi käyttää, pitää luokan toteuttaa ActionListener-rajapinta: class MySwingApp implements Actionlistener Painikkeen tapahtumien kuuntelijaksi lisätään ko. luokka: button.addactionlistener(this); Ja lopuksi pitää siis luokan vielä toteuttaa tapahtumankäsittelijä: void actionperformed(actionevent e){ // TODO: mitä tehdään, kun jokin // ActionEvent tapahtuu Eli tapahtumat pitää ottaa kiinni :)
Tapahtumienkäsittely Lisätään int-muuttuja sekä JLabel, johon laitetaan painikkeen napsauttelujen määrä Jotta attribuutit olisivat käsiteltävissä, ne pitää laittaa luokan attribuutiksi // numclicks pitää kirjaa napsautuksista private int numclicks = 0; // Luodaan uusi label private JLabel labelclicks = new JLabel(); Lisätään tapahtumankäsittely, jossa lisätään muuttujan arvoa void actionperformed(actionevent e){ numclicks++; labelclicks.settext( Clicks: + numclicks);