Stefan Möller OOP F16:1 OOP Objekt-orienterad programmering Föreläsning 16 Grafiska användargränssnitt, GUI Ytor Komponenter Layout-managers Lyssnare.

Slides:



Advertisements
Liknande presentationer
Next previous Björn Eiderbäck NADA, KTH Innehåll Klassdiagram i mer detalj Visibility och modifierare (vilka.
Advertisements

1 2I1049 Föreläsning 8 KTH-MI Peter Mozelius Grafiska gränssnitt, Java interface och händelsehantering.
Repetition av språket Java
Villkor Booelska operatorer Villkorsatser Switchsatser Villkor och annat.
Next previous Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java OOMPA 2000 Föreläsning 15 Innehåll, kort om: Frameworks Grafik.
Next previous GRIP 2000 Föreläsning 4 Innehåll Inmatningstyper Modeller för interaktiva applikationer Observer MVC Lyssnare Pluggbara komponenter Exempel.
Next previous Innehåll Klassen URL Arbeta med URLer, exempel Referenser Harold,”Java Network Programming”, Elliotte Harold Hall, "CORE Web Programming"
Objektorienterad utveckling
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Objektorienterad utveckling Lektion 2 Objekt, överlagring, överskuggning, klasshierarkier och dynamisk bindning KTH Peter Mozelius.
TNSL04 – IT grundkurs. VT2008. Föreläsning nr 4, torsdag 28 feb. kl Klasser, objekt, metoder, parametrar, konstruktorer, samlingar och tillstånd.
TNSL04 – IT grundkurs. VT2009. Föreläsning nr 4, måndag 2 mars. kl Snabbrepris av grundbegreppen: Klasser, objekt, konstruktorer, anrop till konstruktorer,
Metoder i java Det finns två typer av metoder i java
2D1311 Programmeringsteknik med PBL Föreläsning 5 Skolan för Datavetenskap och kommunikation.
Övning5 Så här ska man tänka när man löser uppgift 1 på tentan lite grafik, så här söker man genom en lista så här läser man från en fil i java lösa uppgift.
Programmeringsteknik för K och Media
Swing Grafik delen i Java kallas för Swing. Swing är stort; ca 800 klasser i 16 paket. Swing är en utveckling av AWT (Abstarct Window Toolkit). AWT var.
Att programmera i språket Java
1 ITK:P1 Föreläsning 4 Grafiska gränssnitt och händelsehantering DSV Peter Mozelius.
Föreläsning 8 Appletprogram/fristående grafiska program Rita linjer, rektanglar mm Skriva text Byta färg Appletprogram html.
Next previous Innehåll Klassen URL Arbeta med URLer, exempel Speciella referenser (som används i här) Harold, dvs kursboken ”Java Network Programming”
1 ITK:P1 Föreläsning 6 Layoutmodeller i Java DSV Marie Olsson.
Java Nätverks API URL sockets.
1 Föreläsning 8 Grafik AWT. 2 Grafik Frame använder man för att skapa ett fönster Button använder man om man vill ha en knapp att trycka på Canvas är.
Exception Handling Kapitel 9. Agenda Exceptions try, throw and catch Skapa en egen exception-klass Multipla throw / catch Slänga vidare en exception Olika.
Streams and File I/O Kapitel 10. Agenda Exceptions Textfiler Skriva Appenda Läsa File Sökvägar.
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
JavaFX Pär Sikö, Epsilon Agenda Vad är JavaFX JavaFX exempel Swing och JavaFX Språket Egna komponenter Bindning Operationer och funktioner.
Next previous Föreläsning ii - Mer om Java bla this och konstruktorer Av Björn Eiderbäck Adress: Rum 1641, 6tr NADA Osquars Backe.
MSPEL Föreläsning 2 Text, teckensnitt och grafiska komponenter
Föreläsning 15 (16) Introduktion till Swing. Historik (java.awt) JDK 1.0 – AWT (Abstract Window Toolkit) Paket för gränssnittsprogrammering Har en del.
OOP Objekt-orienterad programmering
OOP F6:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 6 Mer om klasser och objekt Hantera många objekt ArrayList toString() – metoden.
HUMAN-CENTERED SYSTEMS ::: DEPT. OF COMPUTER & INFO. SCIENCE Introduktion till Director Jody Foo.
1 Föreläsning 7 Repetition Instansvariabler och klassvariabler Klassmetoder och Instansmetoder.
ITK:P1 Lektion 4 Att implementera en spelidé i Java DSV Peter Mozelius.
1 MSPEL Lektion 2 DSV Peter Mozelius Spel i Java applets.
Mitt första Java program Mahmud Al Hakim Copyright, Mahmud Al Hakim, 1.
OOP F3:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 3 Iteration Många variabler av samma sort – Arrayer.
1 ITK:P1 Föreläsning 8 Multimedia för spelkonstruktion DSV Peter Mozelius.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 5 Arrayer & ArrayList Hur man använder API:n
TILLÄMPAD DATALOGI (TILDA) Övning 3
OOP F14:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 14 Repetition Tips inför inlämningsuppgift 2.
1 ITK:P2 F6 Sortering av generiska containerklasser DSV Peter Mozelius.
PROGRAMMERINGSTEKNIK Övningsgrupp 3 Marcus Hjelm
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener.
Föreläsning 13 Appletprogram/fristående grafiska program Arv Rita linjer, rektanglar mm Skriva text, byta färg Appletprogram & HTML Grafiska användargränssnitt.
Class VattenKraft{ public static void main(String[] args){ int num=150; int i, totflöde, maxflöde; int[] fall = new int[num]; //vattenflödet i vattenfallen.
ITK:P2 F8 Strömmar och filhantering DSV Peter Mozelius.
Föreläsning 9 Arv kap 8.1 Interface kap 9.2 Grafiska användargränssnitt (GUI) kap 10.
2I1073 Lektion 1 KTH-MI Peter Mozelius XHTML, stilmallar och Javascript.
OOP F13:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 13 Repetition variabler, selektion och iteration.
Central-enhet PM CPU BIOS Skiv- minne Sekundär- minnes- enheter (SM)
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
TILLÄMPAD DATALOGI (TILDA) Övning 1 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
OOP&M - teori1 OOP del III– Föreläsning vecka 9 GUI Containers och LayoutManagers (Inner classes)
OOP&M - teori1 OOP&M del III– Föreläsning 3 vecka 6 Kontrollkomponenter (Components) Som Applets.
OOP&M - teori1 OOP&M del III– Föreläsning 23 vecka 15 Graphics Graphics2D Menyer JMF.
OOP&M - teori1 OOP del III– Vecka 10 Händelser Kontrollkomponenter (Components) Featuring: Applets.
DA7351 Programmering 1 Skapa och placera en komponent i en container Layoutmanagers Applet Händelser och lyssnare Föreläsning 15.
Föreläsning 15: Exceptions & lite swing, gränssnitt
Föreläsning 13: Swing (GUI), händelser, timer
Repetitionsföreläsning 2: Quiz & problemlösning med swing
Presentationens avskrift:

Stefan Möller OOP F16:1 OOP Objekt-orienterad programmering Föreläsning 16 Grafiska användargränssnitt, GUI Ytor Komponenter Layout-managers Lyssnare

Stefan Möller OOP F16:2 GUI - Graphical User Interface Man skapar en yta (ett fönster) och på den ytan adderar man ett antal komponenter. Olika ytor: • JFrame - ”vanligt” fönster • JApplet - fönster i en webbrowser Olika komponenter: JLabel, JTextField, JRadioButton, JComboBox, JButton Till komponenter kopplas Lyssnare som anger vad som skall hända när man t ex trycker på en knapp.

Stefan Möller OOP F16:3 AWT kontra Swing AWT (Abstract Windowing Toolkit) Javas bibliotek för GUI Swing (från version 1.2) fler komponenter, utbyggt funktionalitet Lite förenklat utnyttjar Swing plattformens kapacitet bättre, dock lite krångligare att använda Denna föreläsning behandlar Swing-klassernas enklare delar (liknar AWT) samt de delar av AWT som fortfarande ”behövs” i AWT Button, TextField etc i Swing JButton, JTextField etc

Stefan Möller OOP F16:4 Olika delar som behövs Ytor AWT: Frame, Applet (olika sorters fönster)Swing: JFrame, JApplet Komponenter AWT: Label, TextField, Button, Checkbox, (placeras i ytorna)TextArea, Panel m.fl. Swing: JLabel, JTextField, JButton, JRadioButton, JTextArea, JPanel m.fl. (motsvarande AWT’s + fler) Layout-managers AWT: BorderLayout, FlowLayout, GridLayout m.fl. (hur komponenterna ligger i ytorna)Swing: använder AWT’s + några till Lyssnare AWT: ActionListener, KeyListener, MouseListener m.fl. (kod för vad som skall hända närSwing: använder AWT’s + några till man t ex trycker på en knapp etc.)

Stefan Möller OOP F16:5 Hur gör man för att skapa ett fönster? import javax.swing.*; import java.awt.*; class NamnInmatning extends JFrame{ NamnInmatning(){ super("Namninmatning"); setLayout(new FlowLayout()); JLabel l=new JLabel("Namn:"); add(l); JTextField tf=new JTextField(12); add(tf); JButton knapp=new JButton("Skapa"); add(knapp); setSize(300,75); setVisible(true); } public static void main(String[]args){ new NamnInmatning(); }

Stefan Möller OOP F16:6 JLabel En textsträng, kan ej editeras av användaren. Några metoder hos JLabel: l.setText(”Ny text”); //Sätta ny text på JLabel’n String s = l.getText(); //Returnerar texten just nu import javax.swing.*; class LabelTest extends JFrame{ LabelTest(){ super("Exempel Label"); JLabel l=new JLabel("Hej Hopp!"); add(l); setSize(300,75); setVisible(true); } public static void main(String[]args){ new LabelTest(); }

Stefan Möller OOP F16:7 JButton En knapp man kan trycka på. För att nåt skall hända måste lyssnare kopplas på. Knappen kommer att ta upp hela JFrame’ns yta. Inte så snyggt kanske - fixas med att sätta en annan LayoutManager till JFrame’n - se nästa bild! import javax.swing.*; class KnappTest extends JFrame{ KnappTest(){ super("Exempel Knapp"); JButton knapp=new JButton("Knapp"); add(knapp); setSize(200,75); setVisible(true); } public static void main(String[]args){ new KnappTest(); }

Stefan Möller OOP F16:8 JButton (med FlowLayout) Utseende efter att man gjort: knapp.setEnabled(false); Några metoder hos JButton: knapp.setText(”Annat”);//Ändra knapptexten String s = knapp.getText();//Hämta aktuell knapptext knapp.setEnabled(false);//Göra knappen ”otryckbar” knapp.setEnabled(true); import javax.swing.*; import java.awt.*; class KnappTest2 extends JFrame{ KnappTest2(){ super("Exempel Knapp"); JButton knapp=new JButton("Knapp"); setLayout(new FlowLayout()); add(knapp); setSize(200,75); setVisible(true); } public static void main(String[]args){ new KnappTest2(); }

Stefan Möller OOP F16:9 Vilka olika komponenter finns och vilka metoder & attribut har de? Se java-dokumentationen: javax.swing Class JButton java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--javax.swing.JComponent | +--javax.swing.AbstractButton | +--javax.swing.JButton All Implemented Interfaces: ImageObserver, ItemSelectable, MenuContainer, Serializable, Accessible, SwingConstants Direct Known Subclasses: BasicArrowButton, MetalComboBoxButton

Stefan Möller OOP F16:10 JTextField Ett textinmatningsfält där en textsträng kan skrivas in. Scrollar automatiskt. Obs endast konstruktorn - resten som tidigare bilder. Några metoder hos JTextField: String s = tf.getText(); //Avläser texten tf.setEditable(false); //Tillåter inte inmatning Kan även skapas med text från början: JTextField tf = new JTextField(”Starttext”, 15); TextTest(){ super("Exempel Textfält"); JTextField tf=new JTextField(15); setLayout(new FlowLayout()); add(tf); setSize(200,60); setVisible(true); }

Stefan Möller OOP F16:11 JCheckBox och JRadioButton En checkruta som kan vara på eller av. RadioTest(){ super("Exempel checkboxar"); setLayout(new GridLayout(2,1)); JCheckBox cb=new JCheckBox("Valbar"); JPanel p1=new JPanel(); p1.add(cb); add(p1); JRadioButton rb=new JRadioButton("Valbar2"); JPanel p2=new JPanel(); p2.add(rb); add(p2); setSize(200,100); setVisible(true); } Avläses med metoden isSelected() som returnerar en boolean if (cb.isSelected())... ;

Stefan Möller OOP F16:12 Vad händer om man trycker på krysset uppe till höger? Default-beteendet är att fönstret ”göms” men applikationen fortfarande ”snurrar”. Kan ändras med metoden setDefaultCloseOperation: setDefaultCloseOperation(EXIT_ON_CLOSE); Avslutar applikationen genom att anropa System.exit(0) setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); Ingenting händer

Stefan Möller OOP F16:13 LayoutManager Om man adderar flera komponenter till en JFrame - hur hamnar dessa då? Det bestäms av vilken LayoutManager som JFrame’n har. Alla Container’s (alltså ytor där komponenter kan adderas) har en LayoutManager. Man kan byta LayoutManager om man vill ha en annan än den som är default. Några av de vanligaste: BorderLayout Fem delytor Nord, Syd, Väst, Öst, Center. Default hos JFrame. FlowLayout Komponenterna efter varandra. Default hos JPanel. GridLayout Ett rutmönster med ett antal rader och kolumner. BoxLayout Komponenterna i rad horisontellt eller vertikalt. Ej ”radbyte” LayoutManager ändras med metoden setLayout JFrame fr = new JFrame(); fr.setLayout(new FlowLayout());

Stefan Möller OOP F16:14 Exempel med 10 knappar på en Frame import javax.swing.*; import java.awt.*; class TenKnapps extends JFrame{ TenKnapps(){ super("10 Knappar"); for (int x=1; x<=10; x++) add(new JButton("Knapp "+x)); setSize(250,150); setVisible(true); } public static void main(String[]args){ new TenKnapps(); } Knapparna hamnar ovanpå varandra. Kanske inte riktigt det man vill...

Stefan Möller OOP F16:15 10 knappar med FlowLayout TenKnapps(){ super("10 Knappar"); setLayout(new FlowLayout()); for (int x=1; x<=10; x++) add(new JButton("Knapp "+x)); setSize(250,150); setVisible(true); } Knapparna hamnar olika beroende på fönsterstorlek

Stefan Möller OOP F16:16 10 knappar med GridLayout TenKnapps(){ super("10 Knappar"); setLayout(new GridLayout(4,3)); for (int x=1; x<=10; x++) add(new JButton("Knapp "+x)); setSize(250,150); setVisible(true); } GridLayout(4,3) ger 4 rader med 3 kolumner. Varje ”grej” (här JButton’s) tar upp 1/12 av ytan.

Stefan Möller OOP F16:17 10 knappar med BoxLayout TenKnapps(){ super("10 Knappar"); JPanel pan=new JPanel(); pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); for (int x=1; x<=10; x++) pan.add(new JButton("Knapp "+x)); add(pan); setSize(200, 200); setVisible(true); } med: pan.setLayout(new BoxLayout(pan, BoxLayout.X_AXIS));

Stefan Möller OOP F16:18 Kombinera olika LayoutManager’s TenKnapps(){ super("10 Knappar"); setLayout(new GridLayout(4,1)); JPanel p1=new JPanel(); for (int x=1; x<=2; x++) p1.add(new JButton("Knapp "+x)); add(p1); JPanel p2=new JPanel(); for (int x=3; x<=6; x++) p2.add(new JButton("Knapp "+x)); add(p2); JPanel p3=new JPanel(); for (int x=7; x<=9; x++) p3.add(new JButton("Knapp "+x)); add(p3); JPanel p4=new JPanel(); p4.add(new JButton("Knapp "+10)); add(p4); setSize(400,200); setVisible(true); } Om man ändrar p4 till: JPanel p4=new JPanel(new FlowLayout(FlowLayout.LEFT));

Stefan Möller OOP F16:19 BorderLayout Delar upp ett fönster i fem logiska delytor North South West East Center Man adderar en komponent per delyta. Vill man ha flera på en delyta så läggs dessa i en JPanel. När man adderar väljer man vart man vill addera: add(komponent, BorderLayout.SOUTH); De delytor som ej har något adderat i sig ”krymps” så att andra delytor expanderas. Center expanderas i första hand. De olika delarna är String- konstanter i BorderLayout: NORTH WEST CENTER EAST SOUTH

Stefan Möller OOP F16:20 Exempel BorderLayout BorderTest(){ super("Test av Borderlayout"); JPanel upp=new JPanel(); upp.add(new JLabel("Namn:")); upp.add(new JTextField(15)); add(upp, BorderLayout.NORTH); JPanel ner=new JPanel(); ner.add(new JButton("Skapa")); ner.add(new JButton("Ta bort")); ner.add(new JButton("Sluta")); add(ner, BorderLayout.SOUTH); setSize(300, 250); setVisible(true); } Man ”jobbar” hela tiden genom att skapa små delpaneler (JPanel’s) och i dessa lägga komponenter. Panelerna adderas sedan på lämpligt ställe i JFrame’n. Ibland (ofta...) skapar man delpaneler som läggs i paneler (som läggs i paneler...) och sedan adderas till fönstret (JFrame’n).

Stefan Möller OOP F16:21 Händelser När användaren "gör något" i ett GUI-fönster skapas en händelse: trycker på en knapp skriver i ett textfält fyller i en checkbox rör musen över ett fält etc. Denna händelse kan ”fångas” så att man ser till att en viss kod exekveras. Man kopplar en lyssnare till en komponent. När något händer med den komponenten aktiveras lyssnaren och en metod i lyssnaren anropas. En lyssnare är en klass som implementerar ett gränssnitt. Olika gränssnitt för olika händelser. Enklaste gränssnittet är ActionListener. interface ActionListener{ void actionPerformed(ActionEvent e); } Lyssnar-interfacen ligger på java.awt.event (de flesta, några nya finns i javax.swing.event)

Stefan Möller OOP F16:22 Varje fönster har egen ”livsloop” När ett fönster ritas upp - setVisible(true) anropas - startar en egen exekveringstråd. Denna känner av användarens aktiviteter i fönstret. När olika saker görs anropas lyssnare. Exekveringen fortsätter tills fönstret stängs. En klass som avslutar en applikation, kopplas t.ex. till en knapp ”Quit”. class QuitLyssnare implements ActionListener{ public void actionPerformed(ActionEvent e){ System.exit(0); } Kopplas ihop med en komponent genom att adderas till komponenten JButton quitknapp = new JButton(”Quit”); quitknapp.addActionListener(new QuitLyssnare()); Knappen adderas på lämpligt ställe i fönstret. När man klickar på knappen kommer metoden actionPerformed i QuitLyssnare att anropas och i detta fall programmet att avslutas.

Stefan Möller OOP F16:23 Placering av lyssnarklasser Kan placeras i egen fil. Dock behöver lyssnarna ofta komma åt olika komponenter för att kunna avläsa dessa. Smidigast att placera som inre klasser i JFrame-subklassen. class ExempelGUI extends JFrame{ JButton skapaknapp, quitknapp; JTextField inmatning; ExempelGUI(){ //Konstruktor som skapar komponeterna, placerar dem i fönstret //kopplar ihop med lyssnare och startar fönsterexekveringstråden } class SkapaLyssnare implements ActionListener{ public void actionPerformed(ActionEvent e){ //Det som skall göras. Har åtkomst till de globala komponenterna } public static void main(String[]args){ new ExempelGUI(); }

Stefan Möller OOP F16:24 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Celsius extends JFrame{ public Celsius(){ super("Temperatur-converter"); setLayout(new GridLayout(2,1)); JPanel upp=new JPanel(); upp.add(new JLabel("Temperatur (celsius):")); JTextField inmat=new JTextField(5); upp.add(inmat); add(upp); JPanel ner=new JPanel(); JButton knapp=new JButton("Beräkna"); ner.add(knapp); ner.add(new JLabel("Fahrenheit =")); JLabel res=new JLabel("---"); ner.add(res); add(ner); setSize(220, 100); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public static void main(String[]args){ new Celsius(); } Vi vill skapa ett litet GUI där man kan kolla göra om celsius till fahrenheit Till vänster finns koden som skapar ett sådant fönster, dock inga lyssnare