GUI - del 2. Stein Gjessing Inst for Informatikk Univ. i Oslo

Like dokumenter
Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. GUI - del 2

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

Inf 1010 GUI - del 2

INF1010. Grafisk brukergrensesni. med Swing og awt del 2

INF1010. Grafisk brukergrensesni. med Swing og awt del 2. INF Grafisk brukergrensesni4 II

Uke mars 2005 GUI - del 2. GUI (Graphical User Interface)-programmering

Inf mars 2010 GUI del 2

import javax.swing.*; import java.awt.*;

Vi lærte sist å lage vinduer. Om å lage et vindu. GUI (Graphical User Interface)-programmering. Inf GUI - del 2

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

Grafisk Brukergrensesnitt

4. mars 2008 Grafisk brukergrensesnitt med Swing og awt Litt Modell Utsyn - Kontroll Del I. Stein Gjessing Inst for Informatikk Univ.

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter. GUI (Graphical User Interface)-programmering. del 1. Litt Modell Utsyn - Kontroll

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det: To måter. GUI (Graphical User Interface)-programmering

INF1010 Grafisk brukergrensesni3 (GUI) med Swing/awt. del 1

Grafiske brukergrensesnitt med Swing og AWT

Gjennomgang av eksamen H99

JPanel. Komponent hieraki. Window/JWindow. Applet/JApplet. JDialog. JFrame

UNIVERSITETET I OSLO

INF1010 våren 2006 Uke 19: 9. mai 2006 Et større eksempel: Solitaire (kabal)

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

GUI-programmering, del 3 Vinduslyttere Dialogvinduer GUI-komponenten JTable Egne datamodellklasser. En oversikt over kapittel 19 i boka

GUI («Graphical User Interface») del 2

Hvordan gjør vi det, to typer av vinduer? Om Grafiske Bruker-Grensesnitt (GUI) GUI (Graphical User Interface)-programmering

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

GUI («Graphical User Interface») del 2

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

LO191D/LC191D Videregående programmering

INF 1010, vår 2005 Løsningsforslag uke 10

Kapittel 15: Grafiske brukergrensesnitt. Del II

6108 Programmering i Java. Leksjon 8. GUI: Grafisk brukergrensesnitt. Del 2: Roy M. Istad 2015

Om Grafiske Bruker-Grensesnitt (GUI) Hvordan gjør vi det, to typer av vinduer? GUI (Graphical User Interface)-programmering

Objekter i java.awt.*

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

EKSAMEN. TILLATTE HJELPEMIDLER: Alle trykte og skrevne. INNFØRING MED PENN, evt. trykkblyant som gir gjennomslag

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

2 Om statiske variable/konstanter og statiske metoder.

INF1010. Grensesnittet Comparable<T>

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE. Antall sider (Inkl forsiden): 8. Alle trykte og håndskrevne

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Sortering med tråder - Quicksort

EKSAMEN I FAG TDT MMI Lørdag 4. juni 2005 Tid: kl

UNIVERSITETET I OSLO

GUI 3 JavaFX. Mer interaksjon Hvordan gi input :l programmet. INF1010 Stein Michael Storleer

Mål med kurset. Java i INF Dagens tema. GUI med Swing. Dokumentasjon

Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

EKSAMEN I FAG TDT4180 MMI Mandag 18. mai 2009 Tid: kl

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

UNIVERSITETET I OSLO

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Oblig 4Hybelhus litt mer tips enn i oppgaven

Løse reelle problemer

INF 1010, vår 2005 Løsningsforslag uke 11

INF1010 våren januar. Objektorientering i Java

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1000 (Uke 6) Mer om metoder, tekster

Velkommen til. INF våren 2016

EKSAMEN I FAG TDT4180 MMI Torsdag 27. mai 2010 Tid: kl

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

Forelesning inf Java 5

Kalkulator-leksjonen (nesten ferdig)

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Forelesning inf Java 5

Tittel Objektorientert systemutvikling 1. Eksamenstid, fra-til Ant. oppgaver 6

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

UNIVERSITETET I OSLO

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1010 MVC i tekstbaserte programmer

INF1000 : Forelesning 4

Løsning på småoppgaver etter hvert underkapittel. kap

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

LC191D/LO191D Videregående programmering mai 2010

Enkle generiske klasser i Java

TOD063 Datastrukturer og algoritmer

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

Transkript:

Inf 1010-2009 GUI - del 2 Stein Gjessing Inst for Informatikk Univ. i Oslo

GUI (Graphical User Interface)-programmering g Tidligere Hvordan få laget et vindu på skjermen Hvordan legge ulike komponenter i vinduet (trykknapper, tekstfelter, tekst, bilder,) Enkel behandling av knappetrykk mm. (Layout av vinduer) I dag: Kort repetisjon Grafikk fikk(tegning i vinduet) Mer om input fra brukeren via vinduer Grundig om eventmodellen (fange opp hendelser) og Javas store bibliotek for det Hendelser (Event) Lyttere med grensesnitt eller Adaptere Lyttemetodene 2

Vi lærte sist å lage vinduer JFrame er selve bildet (rammen) komponenter (inne i en Container) Container som er vindusflaten, en egenskap til selve bildet, får vi tak i ved å kalle metoden getcontentpane( ) 3

import java.awt.*; import java.awt.event.*; import javax.swing.*; Om å lage et vindu public class Vindu extends JFrame { JLabel etikett; JTextField tekstfelt; JButton knapp; public Vindu( ) { settitle( Test-vindu"); Container samling = getcontentpane(); samling.setlayout(new FlowLayout()); etikett = new JLabel("Skriv inn navn"); samling. add(etikett); tekstfelt = new JTextField(30); samling. add(tekstfelt); knapp = new JButton( Ferdig"); samling. add(knapp); setdefaultcloseoperation(jframe.exit_on_close); ti ON CLOSE) setbounds(100, 250, 400,150); setvisible(true); Mangler å lytte på knappen / tekstfeltet 4

For å lytte på en komponent (repetisjon) 1. Lag en metode som beskriver hva som skal gjøres når en bestemte hendelser inntreffer. Eksempel: public void actionperformed(actionevent e) {... Metodene skal kalles av Java og må ha et helt bestemte navn som er forhåndsbestemt av Java-biblioteket (polymorf metode). 2. Put metoden inn I en lytterklasse (f.eks. class MinLytter) som implementerer et bestemt interface (også fra Java-biblioteket). 3. Lag et objekt av lytterklassen og send referansen e til dette objektet til den komponenten (f.eks. knappen) som dette objektet skal lytte på. Eksempel: knappen.addactionlistener(new addactionlistener(new MinLytter()); nesten et frittsvevende objekt (bare kontakt kt fra Runtime-systemet) t t) 5

Mer om hvordan hente data fra brukeren Vi må få de data brukeren skriver i vinduet inn i vårt program. Mer spesifikt, vi må kunne skille mellom ulike ting (museklikk, tastetrykk, tekstskriving, mm) brukeren gjør med vinduene som programmet (via kall til operativsystemet) har tegnet opp på skjermen. Vi må direkte finne ut om brukeren har f.eks. Trykket på en trykk-knapp (hvilken) Tastet i ett av tekstfeltene (hvilket felt og hva ble tastet) Hvor er musa (følge dens bevegelser) Klikket med musa (hvor, hvilken, opp, ned) Trykket en tast på tastaturet mm... 6

Vi har lærte å lytte på knapper Dette objektet synes på skjermen (som et knapp) Ferdig knapp.addactionlistener(knappelytter); setter opp en forbinelse mellom knappen og objektet/metoden som håndterer knapptrykk knapp knappelytter Vindu-objekt, subklasse av JFrame Objekt av lytterklassen actionperformed < det som skal gjøres ved knappetrykk> Kobling i kjøre-systemet Pekerens type: ActionListener som implementerer grensesnittet ActionListener 7

Kan også lytte på CR i tekstfelt Dette objektet synes på skjermen (som et tekstfelt) tekstfelt.addactionlistener(tekstlytter); tekstfelt tekstlytter Ved CR Vindu-objekt, Kobling i subklasse av JFrame kjøre-systemet Objekt av lytterklassen actionperformed < det som skal gjøres ved når CR trykkes, f.eks. tekstfelt.gettext(); > som implementerer grensesnittet ActionListener 8

import java.awt.*; import java.awt.event.*; import javax.swing.*; Fullstending mini-program public class Vindu extends JFrame { JLabel ledetekst = new JLabel("Her er felt å skrive i"); JTextField tekstfelt = new JTextField(30); JButton knapp = new JButton("Trykk her"); public Vindu( ) { super("les Tekst Demo"); void lagvindu( ) { tekstfelt.seteditable(true); Container lerret = getcontentpane(); lerret.setlayout(new GridLayout(3, 1)); lerret.add(etikett); lerret.add(tekstfelt); lerret.add(knapp); MinLytter l1 = new MinLytter(); tekstfelt.addactionlistener(l1); knapp.addactionlistener(l1); setdefaultcloseoperation(jframe.exit e o e. _O ON_CLOSE); pack(); setvisible(true); Her lager vi et lytterobjekt Her kobles både knappen og tekstfeltet opp mot dette lytterobjektet public static void main(string[] argumenter) { new Vindu().lagVindu(); 9

Lytter- klasse class Lytter implements ActionListener { public void actionperformed(actionevent e) { String st = tekstfelt.gettext(); tekstfelt.settext(""); System.out.println(st); // slutt class Lytter // slutt class Vindu 10

Flere knapper: Flere lytterklasser: enknapp = new JButton( Noe"); enknapp.addactionlistener(new addactionlistener(new NoeSkjer()); stoppknapp = new JButton( Omstart"); stoppknapp.addactionlistener(new addactionlistener(new ReBoot()); class ReBoot implements ActionListener { public void actionperformed(actionevent e) { setvisible(false); // omliggende vindu System.exit (0); Det er mulig å bruke en klasse med en ActionListener-metode, og test på hvilken knapp som ble trykket på (neste side) class NoeSkjer implements ActionListener { public void actionperformed(actionevent e) {..... 11

Flere knapper: ett lytte-objekt class Forskjellig implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource( ) = = stoppknapp) { setvisible(false); ibl l System.exit (0); else if (e.getsource( ) = = enknapp) {... ActionListener lytter = new Forskjellig(); enknapp = new JButton( Noe"); enknapp.addactionlistener(lytter); stoppknapp = new JButton( Omstart"); t t") stoppknapp.addactionlistener(lytter); 12

main new Vindu( ); Det er også mulig å slå sammen lytter-objektet med andre objekter Dette objektet f.eks.: synes på skjermen (som en knapp) objekt av klassen Vindu (subklasse av JFrame, implementerer ActionListener) Type: ActionListener Kjøresystemet Vindu knapp knapp = new JButton(... ) knapp.addactionlistener(this);... Dette blir litt monolittisk actionperformed 13

Hva kan en bruker gjøre Typer av hendelser Bevege musa innenfor en av våre vinduer inn i vinduet ut av vinduet over en av komponentene (trykk-knapp knapp, tekstfelt,..) - hvilken Klikke musa hvilken knapp eller hvor (x,y i vinduet) klikke ned slippe opp Taste en tast t hvilken trykke ned slippe opp Trykke CR i et tekstfelt 14

GUI og hendelser Op-sys (Win, Linux,..) Ditt Program sin Event Dispatch Thread Hver ting brukeren gjør (flytter eller klikker musa, trykker på tastaturet...) gjør operativsystemet om til en pakke som sendes til GUI-programmet. GUI-et utføres av en tråd (mer om tråder senere) som heter Event Dispatch Thread (EDT). EDT behandler alle hendelsene (pakkene), en for en. Hver gang f.eks musa flyttes ett eneste punkt bortover genereres en ny slik pakke (køen kan forkortes) 15

Mer om pakken (subklasse av EventObject) Inneholder få ting Størrelsen av pakken/objektet er avhengig av type hendelse : Type hendelse : musebevegelse museklikk, trykk på tast (ned eller sluppet)... Verdi, feks f.eks Museposisjon (x,y) i vinduet Hvilken museknapp trykket Hvilken tast trykket verdi: f.eks type hendelse x-pos komponent y-pos Hvilket Vinduskomponent på skjermen dette tilhører Peker til eller tekst Hvordan vet operativsystemet dette? 16

Mer om hendelsesmodellen en kø per program Op-sys (Win, Linux,..) Ditt Program sin Event Dispatch Thread Operativsystemet har vinduer fra flere programmer på skjermen, men vet hvilket vindu (og da program) en hendelse tilhører. Lager en slik kø for hvert program som har vinduer på skjermen Event Dispatch Thread (EDT) i hvert program får da bare sine hendelser. Hvis flere metoder blitt registrert som lyttere av samme type hendelse, får de hver sin kopi av pakka. Kaster de pakkene ingen vil ha 17

Java fordeler pakkene Op-sys while (true) { <les neste pakke> < finn evt. registrerte lyttemetoder> <kall de(m) med pakken som parameter> < kast pakker ingen vil ha> Ditt javaprogram 18

Viktigste lyttergrensesnitt Grensesnitt og typen av hendelser MouseListener museklikk MouseMotionListener musebevegelser ActionListener Trykk på trykknapper / CR i tekstfelt KeyListener Tastetrykk ItemListener Valg i rullegardin + ca 80 andre lytter-grensesnitt f.eks: ListSelectionListener, MenuDragMouseListener, MenuKeyListener, MenuListener, MetaEventListener, MouseInputListener, MouseWheelListener, NamespaceChangeListener, NamingListener, NodeChangeListener, ObjectChangeListener, PopupMenuListener, PreferenceChangeListener, PropertyChangeListener, t RowSetListener, t SSLSessionBindingListener, Li TableColumnModelListener, TableModelListener, TextListener, WindowFocusListener, WindowListener, WindowStateListener 19

Eksempel: Rullegardiner - JComboBox Class RulleLytter implements ItemListener { public void itemstatechanged(itemevent e) { String s = (String) e.getitem(); if (s.equals( Opp")) {fart++; else if (s.equals( Ned")) {fart - - ; else if (s.equals( equals( Høyre")) {retning = hoyre; else if (s.equals( Venstre")) {retning = venstre; JComboBox styring = new JComboBox (); styring.additem( additem( Opp"); styring.additem( Ned"); styring.additem( Venstre"); styring.additem( Høyre"); styring.seteditable(false); styring.additemlistener(new RulleLytter);... 20

Hvordan lage et lytteobjekt to måter: NY 1 Implementere det riktige grensesnittet (KeyListener, ActionListener, ItemListener) Husk at da må vi implementere alle metodene i grensesnittet Dette gjør vi som oftest bare for noen enkle grensesnitt (der det bare er én metode i hvert grensesnitt) : ActionListener ItemListener 2 Lage en lytterklasse som subklasse av en ferdiglaget klasse som allerede er laget og som implementerer lytter-grensesnittet t De heter alle Adapter (KeyAdapter, MouseAdapter,..) og har implementert tomme metoder for alle metodene i grensesnittet. I en subklasse kan vi da enkelt omdefinere de metodene vi skal bruke (vi slipper å gi kode til resten av metodene) 21

KeyAdapter - eksempel Vil lytte på at brukeren gir CR ( = enter-tasten, vognretur på norsk) Telle opp hvor mange tastetrykk som tastes inn i øverste felt Hvis det er CR, så oversette alt til STORE BOKSTAVER i nederste felt 12? 22

KeyListener Metoder i grensenittet: char getkeychar() Returns the character associated with the key in this event. int getkeycode() Returns the integer keycode associated with the key in this event. + ca 10 andre (så en kan forstå det blir litt tungt å implementere dem alle hvis vi bare trenger en eller to) 23

import javax.swing.*; import java.awt.*; import java.awt.event.*; // Husk for hendelseshåndtering class KeyDemo extends JFrame { JLabel etikett = new JLabel("Oversetter til store bokstaver"); JTextField tekstfelt = new JTextField(30), svarfelt = new JTextField(30) ; KeyDemo() { super("keydemo"); tekstfelt.seteditable(true); svarfelt.seteditable(true); Container lerret = getcontentpane(); lerret.setlayout(new GridLayout(3, 1)); lerret.add(etikett); lerret.add(tekstfelt); lerret.add(svarfelt); tekstfelt.addkeylistener(new Tast()); setdefaultcloseoperation(jframe.exit_on_close); pack(); setvisible(true); class Tast extends KeyAdapter { int teller = 0; public void keyreleased (KeyEvent e) { if (e.getkeycode() == KeyEvent.VK_ENTER) ENTER) { String s = tekstfelt.gettext(); svarfelt.settext(s.touppercase()); else { teller++; // slutt keyreleased og Tast svarfelt.settext( settext("du har nå trykket på " + teller +" taster");

public static void main(string[] args) { new KeyDemo(); svarfelt.seteditable(false); Hint til gåten:

Ferdigprogrammerte vinduer for én opplysning JOptionPane inneholder en rekke ferdige små-vinduer De er alle modale (systemet henger til vi har svart) Klasser som nytter disse bør være subklasse av JComponent Disse finnes i ulike varianter, enkle og mer omfattende parametre Problem: Vanskelig (umulig) å skrive rene norske vinduer import javax.swing.*; import java.awt.*; class Dialog1Test extends JComponent{ public static void main(string[] args) { Dialog1Test d = new Dialog1Test(); String s = JOptionPane.showInputDialog(d, "Skriv inn navn."); JOptionPane.showMessageDialog(d, "Du oppga:"+ s); 26

Skal alt på norsk må vi bruke OptionDialog import javax.swing.*; import java.awt.*; class Dialog2Test { public static void main(string[] args) { String [] valg = { "Ja", "Nei" ; int i = JOptionPane.showOptionDialog(null, Klikk Ja for å fortsette", Advarsel",JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,null, PLAIN valg, valg[0]); String [] svar = { "Greit"; JOptionPane.showOptionDialog(null, O ll "Du oppga: " + valg[i], Melding", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, svar, svar[0]); System.exit(0); exit(0); 27

Rullegardindemonstrasjon import javax.swing.*; import java.awt.*; import java.awt.event.*; // Husk for hendelseshåndtering class RulleDemo extends JFrame { JLabel etikett; JTextField tekstfelt, svarfelt; JComboBox kopi; p; RulleDemo() { super("rullegardindemonstrasjon"); etikett = new JLabel("Kopiering"); tekstfelt = new JTextField(30); svarfelt = new JTextField(30) ; tekstfelt.seteditable(true); kopi= new JComboBox (); kopi.additem("kopier som er"); kopi.additem("kopier til store bokstaver"); kopi.additem("kopier til små bokstaver"); kopi.additem("slett"); kopi.seteditable(false); Container lerret = getcontentpane(); lerret.setlayout(new GridLayout(4, 1)); lerret.add(etikett); lerret.add(tekstfelt); lerret.add(svarfelt); lerret.add(kopi); Lytter lytt = new Lytter(); tekstfelt.addkeylistener(lytt); kopi.additemlistener(lytt); setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); pack(); setvisible(true); // slutt konstruktør 28

Rulledemo. forts class Lytter extends KeyAdapter implements ItemListener { int teller =0; public void keyreleased (KeyEvent e) { teller++; svarfelt.settext("du har nå trykket på " + teller+" taster"): public void itemstatechanged(itemevent e) { String s = (String) e.getitem(); if (s.equals("kopier ( som er")) svarfelt.settext(tekstfelt.gettext()); else if (s.equals("kopier til store bokstaver")) svarfelt.settext(tekstfelt.gettext().touppercase()); else if (s.equals("kopier ( til små bokstaver")) svarfelt.settext(tekstfelt.gettext().tolowercase()); else if (s.equals("slett")) { svarfelt.settext(""); tekstfelt.settext(""); public static void main(string[] args) { new RulleDemo(); // slutt class Rulledemo 29

interface MouseListener void mouseclicked(mouseevent e) Invoked when the mouse button has been clicked (pressed and released) on a component. void mousepressed(mouseevent e) Invoked when a mouse button has been pressed on a component. void mousereleased(mouseevent e) Invoked when a mouse button has been released on a component. void mouseentered(mouseevent e) Invoked when the mouse enters a component. void mouseexited(mouseevent E e) Invoked when the mouse exits a component. 30

MouseEvent int getbutton() Returns which, if any, of the mouse buttons has changed state (blitt klikket på). int getclickcount() Returns the number of mouse clicks associated with this event (enkeltklikk, dobbeltklikk). int getx() Returns the horizontal x position of the event relative to the source component. int gety() Returns the vertical y position of the event relative to the source component. + ca. 10 andre metoder 31

En Muse-demo et frihånds tegneprogram 32

Spesifikasjon Vi må lytte på musa (lage en egen klasse) og lagre alle posisjonene musa har vært på (f.eks de siste 10000 posisjonene musa har vært på). Hver gang g musa røres (knapp-nede-trekkes-til-nytt- sted), legger vi til et nytt punkt og tegner opp hele kurven om igjen Samme flaten som tegner, kan også lytte på musa Oppgave 1: Rett opp en opplagt feil i programmet (sammenhengende strek) Oppgave 2: Sjekk hva som skjer hvis vi ikke lagrer alle posisjonene musa har vært på (men for eksempel bare de 100 siste) 33

import javax.swing.*; import java.awt.*; import java.awt.event.*; class MuseDemo extends JFrame { MuseDemo() { settitle("musedemo"); Muse mus = new Muse(); mus.addmousemotionlistener(mus); getcontentpane().add(mus, BorderLayout.CENTER); setdefaultcloseoperation(jframe.exit_on_close); ON CLOSE); pack(); setvisible(true); public static void main(string[] args) { new MuseDemo();

class Muse extends JPanel implements MouseMotionListener { int [] x = new int[10000], y= new int[10000]; int ant = 0; Muse() { setpreferredsize(new Dimension(500, 500)); // De to metodene i MouseMotionListener: public void mousemoved (MouseEvent e) { ; public void mousedragged (MouseEvent e) { if (ant == x.length) ant = 0; x[ant] = e.getx(); y [ant] = e.gety(); ant ++; repaint(); // her ber vi om at vår paintcomponenet() skal kalles public void paintcomponent (Graphics g) { super.paintcomponent(g); // Her tegner vi for (int i=1; i<ant; i++) g.drawline(x[i-1],y[i-1],x[i],y[i]); x[i] y[i]);