tddc30tddc30/2014/lectures/tddc30-lecture7.pdf · •fallstudie: sorteringsalgoritmer (återstår)...
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
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
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