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 kod som tillverkar bildknappar och en metod som vid anropet byt(i,j) byter bild på knapp[i] och knapp[j].

    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 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   |
      |______|     |________|
          ^            ^
       ___|__       ___|____ 1   2 ______
      |Klient|     |Spelplan|-----|JLabel|
      |      |1   2|        |     |______|
      |  nr  |-----| poäng  |1   2 __________
      |______|     |        |-----|JTextField|
          ^        |        |     |__________|
          |        |        |1   3 _______          ___________
          |        |________|-----|JButton|- - - ->|ActionEvent|
          |                       |_______|        |___________|
          |                                              |
           - - - - - - - - - - - - - - - - - - - - - - - - 
    
    Räknaren nr räknar till tre och nollställer sej sen. I spelplanen finns metoderna setText(...) och getText() för övre textfältet, setResultat(...), ökaPoäng() för dom nedre komponenterna 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. Man tillverkar först ikonerna så här
         ImageIcon groda = new ImageIcon("frog.gif");
         ImageIcon pingvin = new ImageIcon("penguin.gif");  
    
    och sedan kan man göra knappar med dessa bilder.
         for(int i=0;i<3;i++) knapp[i]=new JButton(groda);
         knapp[3]=new JButton();
         for(int i=4;i<7;i++) knapp[i]=new JButton(pingvin);
    
    Och så här blir metoden:
         public void byt(int i, int j)    {
           Icon bild1 = knapp[i].getIcon();
           Icon bild2 = knapp[j].getIcon();
           knapp[i].setIcon(bild2)        ;
           knapp[j].setIcon(bild1)        ;}
    
    Den tomma knappens getIcon blir null och det funkar också.


  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 14 januari 2004
    Tekniskt stöd: <webmaster@nada.kth.se>