Ikkunointijärjestelmät Johdanto X-ikkunointijärjestelmä Java Yhteenveto Petri Vuorimaa 1
Tehtävät Piirtorutiinit Syöttölaitteiden monitorointi Tapahtumien välitys Ikkunoiden manipulointi Petri Vuorimaa 2
Näkökulmat Ohjelmointirajapinta + käyttöliittymäkirjasto Sovelluksen käyttöliittymä + vuorovaikutus käyttäjän kanssa Hallintoliittymä + ikkunoiden hallinnointi ym. Käyttöliittymä + kaikki sovellukset ja ikkunat yhdessä Petri Vuorimaa 3
Kolme komponenttia Ikkunamanageri + ikkunoiden sijoittelu Syöttömanageri + syöttölaitteiden monitorointi Perusikkunointijärjestelmä + alusta, jonka päälle sovellukset, ikkunamanagerit ja syöttömanagerit toteutetaan Petri Vuorimaa 4
X-ikkunointijärjestelmä Historia Arkkitehtuuri Grafiikkakirjastot Desktop-ympäristöt Petri Vuorimaa 5
Historia Syntynyt MIT:ssa 1984 Pohjautuu W-ikkunointijärjestelmään (Stanford) Ensimmäinen kaupallinen versio (versio 10) 1986 MIT X Consortium 1988 X11R6 1994 Open Group ottaa vastuun jatkokehityksestä 1996 Kehitystyövastuu siirretään X.org:lle 1999 Petri Vuorimaa 6
Arkkitehtuuri Application Application GKS library X VDI VT100 emulator Window manager Text editor Text library X library X library X library X library Network Keyboard Mouse X server Device library Screen Petri Vuorimaa 7
Asiakas/Palvelin Palvelin toimii työasemassa Asiakas voi toimia samassa työasemassa tai erillisellä tietokoneella Kommunikointia varten oma X-protokolla Usempia asiakas voi käyttää samaa palvelinta ja sama asiakas voi käyttää useampaa palvelinta Petri Vuorimaa 8
XFree86 Suosituin X-ikkunointijärjestelmän toteutus Pentium-alustalle Yksi tärkeimmistä avoimen ohjelmistokoodin projekteista Mukana käytännössä kaikissa Linuxdistribuutioissa Petri Vuorimaa 9
DRI Direct Rendering Infrastructure Asiakas pääsee suoraan käsiksi näyttöpuskuriin Kommunikointi tapahtuu käyttöjärjestelmän ytimen DRI-ajurin kautta Mahdollistaa 3D-grafiikan käytön Petri Vuorimaa 10
Grafiikkakirjastot Sovellukset käyttävät X-ikkunointijärjestelmää peruskirjastojen kautta (Xlib) Alkuperäiset kirjastot tarjoavat vain matalan tason ominaisuuksia Niiden päälle rakennetut kirjastot rajoavat kehineempiä ominaisuuksia Nykyään käytössä kaksi peruskirjastoa: + GTK ja Qt Petri Vuorimaa 11
GTK Kehitetty Motif-kirjaston korvaajaksi GNOME-käyttöliittymän perusta Toteutettu C-ohjelmointikielellä Matkii kuitenkin olio-ohjelmointia Petri Vuorimaa 12
Qt KDE-käyttöliittymän perusta Toteutettu C++-ohjelmointikielellä Perustuu oliohjelmointiin Petri Vuorimaa 13
Hello World (1/2) #include <qapplication.h> #include <qlabel.h> int main( int argc, char* argv[] ) { Petri Vuorimaa 14
Hello World (1/2) } QApplication myapp( argc, argv ); QLabel* mylabel = new QLabel( "Hello world", 0 ); mylabel->resize( 120, 30 ); myapp.setmainwidget( mylabel ); mylabel->show(); return myapp.exec(); Petri Vuorimaa 15
Vuorovaikutus Qt käyttää signal-and-slot -menetelmää vuorovaikutuksen toteuttamiseen Singaalit vastaavat tapahtumia ja slotit ovat tapahtumien käsittelijöitä Petri Vuorimaa 16
Painonappi (1/2) #include <qapplication.h> #include <qpushbutton.h> int main( int argc, char* argv[] ) { QApplication myapp( argc, argv ); QPushButton* myquitbutton = new QPushButton( "Quit", 0 ); myquitbutton->resize( 120, 30 ); Petri Vuorimaa 17
Painonappi (2/2) } QObject::connect( myquitbutton, SIGNAL(clicked()), &myapp, SLOT(quit()) ); myapp.setmainwidget( myquitbutton ); myquitbutton->show(); return myapp.exec(); Petri Vuorimaa 18
Metakääntäjä Qt:n kanssa käytetään yleensä Meta Object Compiler (moc) -kääntäjää Se muuttaa Qt-luokkamääritykset C++-koodiksi moc:n avainsanoja ovat +Q_OBJECT + public slots: + protected slots: +private slots: + signals Petri Vuorimaa 19
Java Johdanto AWT Swing Esimerkki Appletit Petri Vuorimaa 20
Johdanto Javassa on kaksi peruskäyttöliittymäkirjastoa + Abstract Windowing System (AWT) ja Swing AWT hyödyntää Javan alla olevaa ikkunointijärjestelmää + ns. raskas "heavyweight" ikkunointijärjestelmä Swing on uudempi AWT:n laajennus + ns. kevyt "lightweight" ikkunointijärjestelmä Petri Vuorimaa 21
Komponentit Javassa peruselementtejä kutsutaan nimellä komponentti Vastaa widgettejä ja kontrolleja Petri Vuorimaa 22
AWT raskaat komponentit Button Checkbox CheckboxMenuItem Choice Component FileDiag Label List Menu MenuBar MenuComponent MenuItem PopUpMenu ScrollBar TextArea TextComponent TextField Petri Vuorimaa 23
Swing-komponentit (1/2) JButton JCheckBox JCheckBoxMenuItem JColorChooser JComboBox JComponent JEditorPane JFileChooser JLabel JList JMenuBar JMenuItem JMenu JPasswordField JPopupMenu JProgressBar Petri Vuorimaa 24
Swing-komponentit (2/2) JRadioButton JRadioButtonMenuItem JScrollBar JSlider JTable JTextArea JTextComponent JTextField JTextPane JToggleButton JToolBar JToolTip JTree Petri Vuorimaa 25
Containers Container on komponentti joka voi sisältää toisia komponentteja Tyypillisiä esimerkkejä ovat: + ikkunat + popup + dialogit Petri Vuorimaa 26
AWT Containers Applet Container Dialog Frame Panel ScrollPane Window Petri Vuorimaa 27
Swing Containers Box JApplet JDesktopPane JDialog JFrame JInternalFrame JLayeredPane JPanel JRootPane JScrollPane JSplitPane JTabbedPane JViewport JWindow Petri Vuorimaa 28
Asemointi Asemointi määrittelee minkälaisessa järjestyksessä komponentit näytetään visuaalisesti AWT ja Swing sisältävät erilaisia asemointimalleja Swing sisältää samat perusasemoinnit kuin AWT, mutta siinä on myös joukko omia asemointeja Petri Vuorimaa 29
AWT-asemointi BorderLayout CardLayout FlowLayout GridBagLayout GridLayout Petri Vuorimaa 30
Swing-lisäasemoinnit BoxLayout OverLayout ScrollPaneLayout ViewPortLayout Petri Vuorimaa 31
Tapahtumat Tapahtumien perusluokka on java.util.eventobject AWT määrittelee omat GUI tapahtumat luokassa java.awt.awtevent Swing käyttää määrittelee lisäksi omia tapahtumia luokassa javax.swing.event Petri Vuorimaa 32
Tapahtumien käsittely Tapahtumien käsittelyrutiinia kutsutaan tapahtumien kuuntelijaksi Kuuntelijat rekisteröityvät tapahtumien lähteelle + esim. addactionlistener() ja removeactionlistener() Rekisteröintien perusteella tapahtumat välitetään oikeillle käsittelyrutiineille Petri Vuorimaa 33
Swing-esimerkki (GUI) Java DisplayMessage "Do you really want to quit?" "Yes, Please", "No, Thanks" Paluukoodi (0/1) riippuu painetusta napista Message Do you really want to quit? Yes No Petri Vuorimaa 34
Swing-esimerkki (alku) import java.awt.*; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; public class DisplayMessage { public static void main(string[] args) { Petri Vuorimaa 35
Swing (komponenttien luonti) JLabel msglabel = new JLabel(); JButton yesbutton = new JButton(); JButton nobutton = new JButton(); Petri Vuorimaa 36
Swing-esimerkki (asetukset) msglabel.settext(args[0]); msglabel.setborder(new EmptyBorder(10,10,10,10)) yesbutton.settext((args.length >= 2)?args[1]:"Yes"); nobutton.settext((args.length >= 3)?args<[2]:"No"); Petri Vuorimaa 37
Swing-esimerkki (containers) JFrame win = new JFrame("Message); JPanel buttonbox = new JPanel(); Petri Vuorimaa 38
Swing-esimerkki (asemointi) win.getcontentpane().setlayout(new BorderLayout()); buttonbox.setlayout(new FlowLayout()); Petri Vuorimaa 39
Swing (lisää komponentit) buttonbox.add(yesbutton); buttonbox.add(nobutton); win.getcontentpane().add(msglabel, "Center"); win.getcontentpane().add(buttonbox, "South"); Petri Vuorimaa 40
Swing-esimerkki (tapahtumat) yesbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(0); } } nobutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(1); } } Petri Vuorimaa 41
Swing-esimerkki (näytä GUI) } } win.pack(); win.show(); Petri Vuorimaa 42
Appletit Appletit mahdollistavat Java-sovellusten lisäämisen www-sivuille Appletit erovat merkittävästi muista Javasovelluksista + Ei main-metodia + Appletia ei käynnistetä komentoriviltä, vaan se on www-sivun sisällä + Appletilla on merkittäviä turvallisuusrajoituksia Petri Vuorimaa 43
Metodit init() destroy() start() stop() getappletinfo getparameterinfo() getimage() getaudioclip() getparameter() getcodebase() getdocumentbase() showstatus() getappletcontext() Petri Vuorimaa 44
Applet-esimerkki (www-sivu) <APPLET code= MessageApplet.class width=350 height=125> <PARAM name= message value= Hello World > Applet viewer </APPLET> Hello World Petri Vuorimaa 45
Applet-esimerkki (java-koodi) Import java.applet.*; Import java.awt.*; Public class MessageApplet extends Applet { protected String message; protected Font font; Petri Vuorimaa 46
Applet-esimerkki (initialisointi) Public void init() { message = this.getparameter( message ); font = new Font( Helvetica, Font.BOLD, 48); } Petri Vuorimaa 47
Applet-esimerkki (piirto) public void paint(graphics g) { g.setcolor(color.pink); g.filloval(10, 10, 330, 110); g.setcolor(color.red); g.drawoval(10, 10, 330, 110); g.setcolor(color.black); g.setfont(font) g.drawstring(message, 40, 75); } Petri Vuorimaa 48
Yhteenveto Ikkunointijärjestelmä tarjoaa peruspalvelut vuorovaikutteisille sovelluksille Joissakin käyttöjärjestelmissä (esim. Windows) ikkunointi on integroitu muun käyttöjärjestelmän kanssa X-ikkunointijärjestelmä tarjoaa useita käyttöliittymäkirjastoja Myös Javassa on useampia vaihtoehtoja Petri Vuorimaa 49
Lähteet R. W. Scheifler & J. Gettys, "The X Window System," ACM Trans. Graphics, vol. 5, no. 2, April 1986, pp. 79-109. M. J. Hammel, "The History of XFree86," Linux Magazine, Dec. 2001. M. K. Dalheimer, "Linux GUI Development with QT," Linux Magazine, Dec. 2001. D. Sweet et al., KDE 2.0 Development, SAMS, 2000. D. Flanagan, Java Foundation Classes in a Nutshell, O'Reilly, 1999. Petri Vuorimaa 50