Presentation laddar. Vänta.

Presentation laddar. Vänta.

0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener.

Liknande presentationer


En presentation över ämnet: "0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener."— Presentationens avskrift:

1 0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener { JButton b1; public TwoThreads() { JFrame f=new JFrame(); f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); b1=new JButton("Knapp 1"); JButton b2=new JButton("Knapp 2"); b1.addActionListener(this); b2.addActionListener(this); b1.setPreferredSize( new Dimension(100,100)); b2.setPreferredSize( new Dimension(200,200)); f.getContentPane().add( b1,BorderLayout.WEST); f.getContentPane().add( b2,BorderLayout.EAST); f.pack(); f.setVisible(true); while(1==1) { printToScreen(); Thread.yield(); } public void actionPerformed(ActionEvent e) { System.out.println("\n"+e.getActionCommand()); } void printToScreen() { System.out.print("."); } public static void main(String[] args) { TwoThreads tt=new TwoThreads(); }

2 Klassdiagram

3 Sekvensdiagram

4 En enkel klient Börja med en enkel klient utan grafik, som öppnar en förbindelse med try { Socket socket=new Socket("shell.e.kth.se",4712); BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter ut=new PrintWriter(socket.getOutputStream()); ut.println("Charlotta"); ut.flush(); System.out.println(in.readLine()); } Den ska alltså sända ditt namn till den server som lyssnar på port 4712 och skriva ut det svar du får. Kom ihåg ut.flush(), annars sänds inte namnet iväg. När klienten fungerar kan du ägna dej helt åt det grafiska gränssnittet. Om servern skulle ha dött på shell.e.kth.se kan du använda servern som går på w2.nada.kth.se i stället. Samma portnummer. Swingkomponenterna Ditt program ska vara en public class Klient extends JFrame implements ActionListener{ där vänstra halvan är din spelplan och högra halvan datorns spelplan. Du ska använda BoxLayout, den layout som oftast blir bra. Varje spelplan är en vertikal Box som uppifrån och ner innehåller Rubrik, en JLabel med texten Jag: eller Datorn:. Meddelande, ett JTextField där det som sänds från dej och från datorn syns. (Först hälsningen, sedan STEN, SAX eller PÅSE). En knapp med en stenbild (skapas med new JButton (stenbild)...) En knapp med en saxbild (...där bilden är en ImageIcon...) En knapp med en pappersbild (...vars konstruktor vill ha en gif-fil) Resultat, en JLabel som efter ett tryck visar ETT..., efter andra trycket TVÅ... och efter tredje VINNER, OAVGJORT eller FÖRLORAR. Poäng, ett JTextField som visar Poäng: 7 Låt Spelplan vara en inre klass, så är det enkelt att skapa två exemplar av den och lägga bredvid varandra i en horisontell box. Fördelen med en box är att man kan lägga in fasta mellanrum mellan komponenterna Om man deklarerat Box box=Box.createHorizontalBox(); kan man göra så här. box.add(jag); //Spelplan jag=new Spelplan("Jag:"); har redan deklarerats box.add(Box.createHorizontalStrut(20)); //Ett mellanrum box.add(du); //Spelplan du=new Spelplan("Datorn:"); har redan deklarerats Extrauppgift: Lägg till ljudeffekter! (Kan kräva hörlurar på elektrodatorer utan högtalare). 1. Objektmodellera labben Sten, sax, påse!

5 1.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. 2.Klassen Klient ska ärva JFrame och implementera ActionListener. 3.Knapptryckningslyssnaren bör inte vara knappen själv och inte i Spelplan, eftersom metoden actionPerformed ska meka med BÅDA spelplanerna. Lyssnaren bör vara i … En första analys: kraven i textform

6 Use Cases Användaren väljer vilken hand han vill vissa. Valet markeras genom att ändra på knappen och skriva ut valet i text. Datorn svarar genom att kontakta servern. Servens svar skrivs ut i text. Användaren frågar två ggr till, den tredje gången noteras vinsten och de två textfälten med poäng uppdateras. Domänklasser: Klient, Spelplan Övriga klasser: JFrame, Box, JButton

7 Klassdiagram

8 Implementation: Vilken arbetsmetodik? Robusthet, anpassningsbarhet och återanvändbarhet? Robusthet – Vi använder (måste) try-catch för felhantering Anpassningsbarhet – Klienten kan bytasut mot en som lokalt generar händerna sten, sax och påse Återanvändbarhet – Spelplan kan användas I ett nytt “lokalt” program Abstraktion, inkapsling och modularitet Abstraktion – Spelaren kan både vara datorn och människa Inkapsling – All kommunikation sker i klienten Modularitet – Spelaren är en egen modul som kan användas i flera olika program

9 Vilka designmönster används? Factory – Används med fördel när boxarna ska skapas Adapter – Klienten kan skrivas så att den både klarar av en nätverks och lokal hand generering Observer – Händelsehanteringen i … Model-View-Control – Vi har grafik…

10 Dokumentation av kod Tre typer av kommentarer: i) /* */ii) //iii) /** */ Javadoc exempel: /** Metoden returnerar summan av två x Detta ska vara tal y Detta ska vara tal Summan av de två talen A och B */ Public int summa(int x, int y) { return x+y; } När ska man kommentera? Allt som är deklarerat public Viktiga privata och lokal variabler och metoder.

11 2. Grafik 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 En metod som vid anropet byt(i,j) byter bild på knapp[i] och knapp[j].

12 Implementation 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å.

13 3. Hur gör man en pianoklaviaturm ed BoxLayout?

14 Lösning 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. 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:

15 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 ; }

16 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() ; } Mer tips: I paketet Applet finns det klasser och metoder som kan användas för att spelaupp ljud.


Ladda ner ppt "0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener."

Liknande presentationer


Google-annonser