tddc30tddc30/2014/lectures/tddc30-lecture7.pdf · •fallstudie: sorteringsalgoritmer (återstår)...

25
TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Strömmar Grafiskt användargränssnitt, Swing Lyssnare och händelser 1

Upload: ngotruc

Post on 18-Sep-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: • Strömmar • Grafiskt användargränssnitt, Swing • Lyssnare och händelser 1

Hittills, och vidare!

• Objektorientering och Java

• Objekt, klasser, instanser

• Arv, polymorfism

• Dölj implementationen

• Interface!

• Abstrakta datatyper (ADT)

• Datastruktur med algoritmer

• Listor, köer och stackar

• Gränssnitt vs implementation

• Analys av algoritmer

• Komplexitet: tids-, rums-

• Fallstudie: Sorteringsalgoritmer (återstår)

2

In- och utmatning

Definition: En ström (en. Stream) är en sekvens av data från någon källa och/eller till något mål. • In och utmating i Java utförs av strömmar Vanliga exempel • System.out (av klassen PrintStream)

• Vanligen kopplad till terminalen

• System.err (av klassen PrintStream) • Vanligen kopplad till terminalen

• System.in (av klassen InputStream) • Vanligen ihopkopplad med annan ström som formaterar indatat, ex.

BufferedReader, BufferedLineReader, Scanner

3

In- och utmatning(2)

Exempel

// connect reader to inputstream

BufferedReader input = new BufferedReader(

new InputStreamReader(System.in));

// read a line and convert to int

int num = Integer.parseInt(input.readLine());

// open file for reading

FileInputStream stream = new FileInputStream(

new File("test.txt"));

Scanner scanner = new Scanner(stream);

// read from file

System.out.println(scanner.nextInt()); 4

Formatering

• Ofta vill man skriva ut på en viss form

double d = 10.0/3.0;

System.out.println(d); // 3.3333333333333335

• Metoden format i PrintStream kan hjälpa till:

System.out.format("Värdet %1.2f är bra grejor.\n", d); // 3,33

Locale.setDefault(Locale.UK);

// format adjust itself by looking at default locale!

System.out.format("The value %1.2f is indeed good\n.", d); // 3.33

5

Formatering(2)

• Formatspecificerare är på följande form:

%[flagga][bredd]typ

Typ Förklaring Flaggor Förklaring

d Heltal, decimal fom

- Vänsterjustering

x Heltal, hexadecimal form

+ Talets tecken skrivs ut

f Reellt tal, decimalform

blankt Positivt tal inleder med blank

e Reellt tal, exponentform

, Siffrorna grupperas tre och tre

Fler specificerare finns, se Javas API-dokumentation

6

Datum och tid

• Klassen Date sparar en tid

// num = number of milliseconds since Jan 1, 1970

Date date = new Date(num);

• Klassen Calendar är mer användbar, och kan ta fram nuvarande tid som ett Date.

Calendar cal = Calendar.getInstance();

System.out.format("The time is: %tc \n", cal.getTime());

int minute = cal.get(Calendar.MINUTE); 7

Datum och tid(2)

• DateFormat: en (abstrakt) klass som formaterar datum åt oss

DateFormat time = DateFormat.getTimeInstance();

DateFormat date = DateFormat.getDateInstance();

Date now = Calendar.getInstance().getTime();

// note that this is locale dependent

System.out.println(time.format(now)); // 13:37:00

System.out.println(date.format(now)); // 2012-nov-14

(Mer kontroll? SimpleDateFormat!) 8

Scanner

• Scanner: En klass som hjälper oss att hantera inmatning

• Kopplas mot en InputStream

// example usage of scanner

Scanner scanner = new Scanner(System.in);

while (scanner.hasNextInt()) {

myList.add(scanner.nextInt());

}

9

Hantering av strömmar

• Filer läses som strömmar

• För textfiler, använd FileReader resp. FileWriter

String filename = "myfile.txt";

FileReader reader = new FileReader(new File(filename));

Scanner scanner = new Scanner(reader);

//...

scanner.close(); // always close your streams!

scanner.nextInt(); // error, since scanner + stream is now closed

10

Hantering av (binära) datafiler

• För binära filer, använd DataInputStream resp. DataOutputStream

String filename = "myfile.dat"; DataInputStream input; try { input = new DataInputStream(new FileInputStream(filename)); while (true) { System.out.println(input.readInt()); } } catch (EOFException e) { System.out.println("Something went wrong while reading:"); e.printStackTrace(); // print the details! } finally { input.close(); // always close! }

11

Serialisering

• Det går att spara objekt på fil mellan körningar

• Java kan ”platta till” ett objekt till en sekvens av bytes

• Perfekt för att spara

• Använd strömmarna ObjectInputStream och ObjectOutputStream

• Kräver att klassen implementerar interfacet Serializable

Object readObject(); // casting is needed to be usable

void writeObject(Object o);

ObjectOutputStream out = new ObjectOutputStream(

new FileOutputStream(new File("test.dat")));

out.writeObject(new Cat("Isaac", 11)); // if Serializable!

out.writeObject("Hejsan"); // String is Serializable 12

Grafiskt användargränssnitt

Motivering

För ”vanligt folk” är följande inte ett program:

Men detta är:

13

Grafiskt användargränssnitt(2)

• Fönster ser ut och konstrueras på olika sätt i olika operativsystem

• Java abstraherar bort detta med grafikpaketet Swing

• Swing – ett uniformt sätt att skapa GUI

• Byggd ovanpå föregångaren AWT

14

Dialogrutor

• JOptionPane används för att visa dialogrutor

Ett urval av de statiska metoderna:

• showConfirmationDialog

• showInputDialog

• showMessageDialog

String name = JOptionPane.showInputDialog("Vad heter du?");

If (name != null) { // null if user cancels

JOptionPane.showMessageDialog(null, "Hej " + namn);

}

15

Dialogrutor(2)

Körexempel:

16

Fönster

• Rätt snart vill man rita upp egna typer av fönster

• Lösning:

• Klassen JFrame implementerar ett fönster

• För att skapa ett eget, skriv en klass som ärver från denna

• Fyll sedan fönstret med de komponenter du vill ha

17

Fönster, exempel

public class MyFrame extends JFrame {

public MyFrame(){

super("Välkomstfönster");

JLabel text = new JLabel("Hej allesammans!");

getContentPane().add(text);

setSize(new Dimension(300, 200));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {

JFrame theWindow = new MyFrame();

theWindow.setVisible(true);

}

} 18

Komponenter

19

Layouthanterare

• Problem: Om två eller flera komponenter läggs till, var placeras de?

• Lösning: Använd en layouthanterare

getContentPane().setLayout(new FlowLayout());

FlowLayout Komponenterna placeras från vänster till höger i rader,

uppifrån och ner

GridLayout(r, k) Delar upp fönstret i rutmönster om r rader och k kolumner. Alla rutor (d.v.s. komponenter) blir lika stora

BorderLayout Delar upp fönstret i fem delar: längs sidorna och i mitten: NORTH, SOUTH, WEST, EAST, CENTER

BoxLayout(riktning) En gör-det-själv layout. Placerar komponenterna brevid varandra antingen i x-led eller y-led. Lätt att förstå, mycket att skriva.

...

20

Layouthanterare(2)

• Gissa layouthanterare:

• Borderlayout

• - Layouten blir ofta ganska grov

• + Enkel att använda

21

Händelser och lyssnare

• För att programmet ska kunna reagera på händelser kopplar man på olika typer av lyssnare till komponenter i fönstret

• Lyssnarna kan fånga upp händelser som knapptryckningar och musrörelser

• Observera att lyssnare är interfaces, du måste själv implementera dem

Händelse Lyssnare

ActionEvent ActionListener

MouseEvent MouseListener, MouseMotionListener

KeyListener KeyEvent

MenuEvent MenuListener 22

Graphics

• Problem: Ibland vill man inte använda standardkomponenter, utan behöver skapa något helt eget

• Lösning:

• Skapa en egen komponent genom att ärva från JComponent

• Överskugga metoden paintComponent(Graphics g)

• Nu finns tillgång att fritt rita ut sin komponent

• Komponenten kan sedan hanteras som vilken annan komponent som helst, t.ex. av en layouthanterare

23

Graphics(2)

• En Graphics kan ses som en pensel associerad till en viss rityta

Relaterade klasser:

24

setColor, setPen, setBrush, setFont

drawLine

drawRect, fillRect

drawOval, fillOval

drawImage

drawString

Color Representerar en 24 bitars färg

Pen Beskriver en penna: tjocklek, stil..

Font Beskriver typsnitt

JComponent

• Användbara metoder:

• void repaint() – Be om utritning

• void paintComponent(Graphics g) – Anropas vid utritning

• Dimension getSize() – Ger komponentens nuvarande storlek

• void setPreferredSize(Dimension dim) – Sätter komponentens önskade storlek

25