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 f = 10.0/3.0;
System.out.println(f); // 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.
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!)
8Scanner
•
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, 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 files, or risk losing data!
scanner.nextInt(); //this will produce an error, since file is closed
10
Hantering av (binära) datafiler
• För datafiler, använd DataInputStream resp. DataOutputStream
String filename = ”myfile.dat”;
try {
DataInputStream 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 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 olika ut 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) {
JOptionPane.showMessageDialog(null, ”Hej ” + namn);
}
15Dialogrutor(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, 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 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
MenuListener MenuEvent 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)
•
Graphics ska ses som en verktygslåda för att rita och är dessutom själva ritytan
Relaterade klasser:
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
24