Programutvecklingsteknik 28 mars 2001

Övning 3

  1. Objektmodellera labben Sten, sax, påse!


  2. I labben Hoppsansa används knappar med olika bakgrundsfärg. Med swingkomponenten JButton kan man låta knappen visa en bild. Anta att filen frog.gif visar en groda som hoppar åt höger och filen penguin.gif en pingvin som hoppar åt vänster. Skriv klassen Ruta som är en sådan bildknapp och som har en uppdaterings- metod set(i) där i är något av heltalen 0,1,2 och där 1 betyder groda och 2 pingvin.

    frog.gif frog.gif frog.gif        penguin.gif penguin.gif penguin.gif


  3. Stensaxpåsvärldsmästerskapet på Internet behöver en klient- serverlösning. Skissa den! Den som först når sjutton poäng vinner matchen och varje spelare har tio sekunder per klickning.


  4. Hur gör man en pianoklaviatur med BoxLayout?

Lösningar

  1. Sten, sax, påse Programmet består faktiskt av tre olika delar: kommunikationen med servern, spellogiken och grafiken. Om tre programmerare tar var sin del är det två saker man måste tänka på. Av labbinstruktionen framgår det att det ska finnas två vertikala boxar bredvid varandra, en med rubriken Jag och en med rubriken Datorn. Man ska alltså göra två objekt av klassen Spelplan, som ärver swingklassen Box. Klienten kan själv ärva JFrame. Knapptryckningslyssnaren bör inte vara knappen själv och inte ens dess spelplan, eftersom metoden actionPerformed ska meka med BÅDA spelplanerna.
                           ______       ________
     ____                 |JFrame|     |  Box   |
    /Spel\____            |______|     |________|
    \____/    |               ^            ^
      ^       |            ___|__       ___|____ 1   2 ______
      |       |___________|Klient|     |Spelplan|-----|JLabel|
               ______     |      |1   2|        |     |______|
      |       /Server\____|      |-----|        |1   2 __________
              \______/    |______|     |        |-----|JTextField|
     _|___       ^            ^        |        |     |__________|
    |Model|      |            |        |        |1   3 _______     
    |_____|   ____________    |        |________|-----|JButton|- - 
             | Connection |   |                       |_______|   | 
             |____________|   |                                   |
                               - - - - - - - - - - - - - - - - - - 
    
    I Model finns räknaren nr som räknar till tre och sedan nollställer sej. Där finns också minPoäng, dinPoäng, mittSvar och dittSvar. I Spelplan finns metoderna setText(...) och getText() för övre textfältet, setResultat(...) och ökaPoäng() för dom nedre textfälten och framför allt metoden markera(String texten) som kollar vilken av knapparna som bär texten, gör dess bakgrund gul och övriga knappars bakgrund grå och skriver texten i meddelandefältet.


  2. Objektmodellen ritade vi på förra övningen. Var kommer bilderna in i den? Vår egen klass Ruta har ingen bild utan den finns i JButton. Men vi måste också ha bilderna i Hoppsansa för att kunna uppdatera knapparna.
    
       ________       _________       ___________
      | Applet |     | JButton |---->| ImageIcon |
      |________|     |_________|     |___________|
          ^              ^        
          |              |        
     _____|_____ 1   7 __|___     
    | Hoppsansa |---->| Ruta |      Här har vi inte ritat ut Model,
    |           |     |______|      Panel och Label, som också finns.
    |           |
    |           |1   3 ___________
    |           |---->| ImageIcon |
    |___________|     |___________|
    
    Man tillverkar först ikonerna och lägger dom i en array.
        ImageIcon groda = new ImageIcon("frog.gif")                  ;
        ImageIcon pingvin = new ImageIcon("penguin.gif")             ;
        ImageIcon bild = {null,frog,pingu}                         ;
        - - -
        class Ruta extends JButton                                   {
            public void set(int n)                                   {
                setBackground(färg[n])                               ;
                setIcon(bild[n])                                     ;}}
    



  3.    ______        ______        ______
      |Klient|2    1|Server|1    2|Thread|
      |______|------|______|------|______|
    
    Servern startar två klockor och när båda klienterna gjort sitt val meddelar den resultatet. För att man ska vara säker på spelarnas identitet krävs något inloggningssystem med lösenord.


  4. Piano Det finns inget naturligt sätt att dela in klaviaturen i vertikala småboxar som läggs in i en stor horisontell box. Jag föreslår att man skär vertikala snitt längs dom svarta tangenternas ytterkanter. Då uppstår tre sorters bitar:
    1. En svartbox är en vertikal box med en svart JPanel överst och en horisontell box under den med två vita paneler och ett litet mellanrum (görs med Box.createHorizontalStrut(2)).
    2. En smalbox är en enda hög smal vit JPanel.
    3. En bredbox är en horisontell box med två höga smala vita JPanel och ett litet mellanrum.
    import java.awt.*                                   ;
    import javax.swing.*                                ;
    import java.awt.event.*                             ;
    public class Piano extends JFrame                   {
        Box oktav=Box.createHorizontalBox()             ;
        public Piano()                                  {
            getContentPane().setLayout(new FlowLayout());
    	oktav.add(bredbox())                        ;
    	oktav.add(svartbox())                       ;
    	oktav.add(smalbox())                        ;
    	oktav.add(svartbox())                       ;
    	oktav.add(bredbox())                        ;
    	oktav.add(svartbox())                       ;
    	oktav.add(smalbox())                        ;
    	oktav.add(svartbox())                       ;
    	oktav.add(smalbox())                        ;
    	oktav.add(svartbox())                       ;
    	oktav.add(bredbox())                        ;
            oktav.setBackground(Color.white)            ;
    	getContentPane().add(oktav)                 ;
            setSize(290,240)                            ;
            setBackground(Color.white)                  ;
            setVisible(true)                            ;}
        public Box bredbox()                            {
            Box box=Box.createHorizontalBox()           ;
            box.add(bredvit())                          ;
            box.add(Box.createHorizontalStrut(2))       ;
            box.add(bredvit())                          ;
            return box                                  ;}
        public Box smalbox()                            {
            Box box=Box.createHorizontalBox()           ;
            box.add(smalvit())                          ;
            return box                                  ;}
        public JPanel bredvit()                         {
            JPanel bred=new JPanel()                    ;
            bred.setBackground(Color.white)             ;
            bred.setPreferredSize(new Dimension(23,200));
            return bred                                 ;}
        public JPanel smalvit()                         {
            JPanel smal=new JPanel()                    ;
            smal.setBackground(Color.white)             ;
            smal.setPreferredSize(new Dimension(11,200));
            return smal                                 ;}
        public Box svartbox()                           {
    	Box box=Box.createVerticalBox()             ;
            box.add(svarttangent())                     ;
    	box.add(vithalvor())                        ;
            return box                                  ;}
        public Box vithalvor()                          {
    	Box box=Box.createHorizontalBox()           ;
            box.add(vithalva())                         ;
    	box.add(Box.createHorizontalStrut(2))       ;
            box.add(vithalva())                         ;
            return box                                  ;}
        public JPanel vithalva()                        {
            JPanel halva=new JPanel()                   ;
            halva.setBackground(Color.white)            ;
            halva.setPreferredSize(new Dimension(14,80));
            return halva                                ;}
        public JPanel svarttangent()                    {
            JPanel tang=new JPanel()                    ;
            tang.setBackground(Color.black)             ;
            tang.setPreferredSize(new Dimension(30,120));
            return tang                                 ;}}
    class Pianotest                                     {
        public static void main(String[] args)          {
    	new Piano()                                 ;}}
    

    ^ Upp till kurssidan.


    Sidansvarig: <henrik@nada.kth.se>
    Senast ändrad 22 mars 2004
    Tekniskt stöd: <webmaster@nada.kth.se>