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

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

INF1010. Grafisk brukergrensesni. med Swing og awt del 2

Inf 1010 GUI - del 2

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

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

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

Inf mars 2010 GUI del 2

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

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

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

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

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

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

Grafiske brukergrensesnitt med Swing og AWT

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

UNIVERSITETET I OSLO

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

Gjennomgang av eksamen H99

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

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

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

GUI («Graphical User Interface») del 2

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

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

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

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

LO191D/LC191D Videregående programmering

GUI («Graphical User Interface») del 2

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

Kapittel 15: Grafiske brukergrensesnitt. Del II

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

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.

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

INF1010. Grensesnittet Comparable<T>

TOD063 Datastrukturer og algoritmer

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

UNIVERSITETET I OSLO

1 t:n'v'\ekode LO325E. Alle ~vne og trykte. GOd'"j(jent kalkulator

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

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

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; }

Løsningsforslag til eksamen i INF1000 våren 2006

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

Sortering med tråder - Quicksort

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

UNIVERSITETET I OSLO

Argumenter fra kommandolinjen

Eksamensoppgave Vår 2012 Ordinær eksamen Bokmål. Videregående programmering. Eksamensdato: Studium/klasse: 2. klasse

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

2 Om statiske variable/konstanter og statiske metoder.

Objekter i java.awt.*

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

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

LC191D/LO191D Videregående programmering mai 2010

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

Prøveksamen 2004 INF1010 Operasystemet med GUI + Ordkryss (modifiserte løsninger etter innspill fra forelesningen) Arne Maus Inst for informatikk

INF Uke 10. Ukesoppgaver oktober 2012

INF1010 MVC i tekstbaserte programmer

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

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

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

INF1000 (Uke 6) Mer om metoder, tekster

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

Kalkulator-leksjonen (nesten ferdig)

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Kapittel 13: Grafiske brukergrensesnitt. Java som første programmeringsspråk

Kapittel 13: Grafiske brukergrensesnitt. Java som første programmeringsspråk

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Graphics. Grafikk. Praktisk sett: Koordinatsystemet. kodeeksempel

Introduksjon til objektorientert programmering

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

Forelesning inf Java 5

Kanter, kanter, mange mangekanter

HØGSKOLEN I SØR-TRØNDELAG

Forelesning inf Java 5

INF1000: Forelesning 7

UNIVERSITETET I OSLO

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

UNIVERSITETET I OSLO

Transkript:

INF1010 Grafisk brukergrensesni. med Swing og awt del 2 1

GUI (Graphical User Interface)- programmering n n n Enkel behandling av knappetrykk mm. Layout av vinduer Om å lytte på knappetrykk med musa n Grafikk (tegning i vinduet) n Input fra brukeren via vinduer n Eventmodellen (fange opp hendelser) og Javas store bibliotek for det n n n Hendelser (events) Lyttere med grensesnitt eller Adaptere Lyttemetodene 2

Vi lærte sist å lage vinduer JFrame er selve bildet (rammen) komponenter (inne i en Container) Elementene kan legges rett i ramma (Jframe) eller i et objekt av JPanel (som deretter legges Inn i ramma) 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"); setbounds(100, 250, 400,150); JPanel panel = new JPanel(); etikett = new JLabel("Skriv inn navn"); panel.add(etikett); tekstfelt = new JTextField(30); panel.add(tekstfelt); knapp = new JButton( Ferdig"); panel.add(knapp); add(panel); setdefaultcloseoperation(jframe.exit_on_close); setvisible(true); Mangler å lytte på knappen/tekstfeltet 4

Samme eksempel, men legger elementene rett i ramma (JFrame) 5

De viktigste byggesteinene i GUI-programmering Vinduer/rammer/flater/lerreter JFrame JPanel setlayout() add() paintcomponent() Utlegg/layouts BorderLayout FlowLayout GridLayout.. Elementer/objekter (subklasser av JComponent) JLabel, JTextField, JButton, addactionlistener() Lyttergrensesnitt (alternativt adaptere) KeyListener, ActionListener, ItemListener,. actionperformed(actionevent e), m.fl... 6

For å lytte på en komponent 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 til dette objektet til den komponenten (f.eks. knappen) som dette objektet skal lytte på. Eksempel: knappen.addactionlistener(new MinLytter()); nesten et frittsvevende objekt (bare kontakt fra Runtime-systemet) 7

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 JButton 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 8

acmonperformed kan også ly4e på CR i tekstelt Dette objektet synes på skjermen (som et tekstfelt) tekstfelt.addactionlistener(tekstlytter); JTextField tekstfelt tekstlytter Ved CR Vindu-objekt, subklasse av JFrame Objekt av lytterklassen actionperformed < det som skal gjøres ved når CR trykkes, f.eks. tekstfelt.gettext(); > Kobling i kjøresystemet som implementerer Grensesnittet ActionListener 9

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); setlayout(new GridLayout(3, 1)); add(etikett); add(tekstfelt); add(knapp); MinLytter l1 = new MinLytter(); tekstfelt.addactionlistener(l1); knapp.addactionlistener(l1); setdefaultcloseoperation(jframe.exit_on_close); pack(); setvisible(true); public static void main(string[ ] argumenter) { new Vindu().lagVindu(); Her lager vi et lytterobjekt Her kobles både knappen og tekstfeltet opp mot dette lytterobjektet 10

Lytterklassen 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 11

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

Flere knapper: en lytte-metode class Forskjellig implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource( ) = = stoppknapp) { setvisible(false);... else if (e.getsource( ) = = enknapp) {... ActionListener lytter = new Forskjellig(); enknapp = new JButton( Noe"); enknapp.addactionlistener(lytter); stoppknapp = new JButton( Stopp"); stoppknapp.addactionlistener(lytter); 13

Det er også mulig å slå sammen lytter-objektet med andre objekter f.eks.: main new Vindu( ); Dette objektet 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 lett litt monolittisk ActionListenerrollen actionperformed 14

2D grafikk tegning i (en del av) vinduet Alle klassene i Swing og awt har paint() metoder som kalles når systemet får beskjed om å vise noe på skjermen eks. setvisble(true). Vi kaller aldri disse direkte bare indirekte via repaint() og setvisible(true) metodene Vi lager selv vår versjon av paint() eller paintcomponent() når vi vil lage grafikk i en flate f.eks. et JPanel Når metodene paint() eller paintcomponent() som vi har laget, kalles fra systemet, får de med en parameter, Graphics g, og det er på denne g vi skal tegne 15

import javax.swing.*; import java.awt.*; class Firkant extends JPanel { Firkant() { // angir foretrukket størrelse på dette lerretet. setpreferredsize(new Dimension(200, 200)); public void paintcomponent(graphics g) { // Her tegner vi g.drawrect(50, 50, 100, 100); class FirkantDemo extends JFrame { FirkantDemo() { settitle("firkantdemo"); JPanel panel = new Firkant(); // lag panel (med firkant ) add(panel); // legg firkanten inn setdefaultcloseoperation(jframe.exit_on_close); pack( ); //passe stort vindu setvisible(true); // gjør alt synlig public static void main(string[] args) { new FirkantDemo(); 16

10 firkanter public void paintcomponent (Graphics g) { for (int i = 0; i < 100; i += 10){ g.setcolor(color.cyan); g.fillrect(10+i, 10+i, 100+i, 100+i); g.setcolor(color.white); g.drawrect(10+i, 10+i, 100+i, 100+i); public void paintcomponent (Graphics g) { for (int i = 0; i < 100; i += 10) g.drawrect(50+i, 50+i, 100+i, 100+i); 17

Tekst og linjer Bytter ut class Firkant i eksempelet: class Firkant extends JPanel { int topp = 50, kant= 100, vside= 40; Firkant( ) { setpreferredsize(new Dimension(vside+kant+vside, topp+kant+30)); public void paintcomponent(graphics g) { super.paintcomponenet(g); // prøv med og uten g.setcolor(color.cyan); g.fillrect(vside, topp, kant, kant); g.setcolor(color.black); Font skrift = new Font("SansSerif",Font.BOLD,12); g.setfont(skrift); g.drawstring("firkant",vside+5,topp + kant/2); g.setcolor(color.white); g.drawline(vside+5,topp+kant/2+5,vside+kant-5,topp+kant/2+5); 18

Vise fram et bilde 19

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, tekstelt,..) - hvilken Klikke musa hvilken knapp eller hvor (x,y i vinduet) klikke ned slippe opp Taste en tast hvilken trykke ned slippe opp Trykke CR i et tekstelt.... 20

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 et objekt 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 et nytt slikt objekt (køen kan forkortes) 21

Mer om parameteren (subklasse av EventObject) for eksempel: public void acmonperformed(acconevent e) Inneholder få Mng Størrelsen av objektet som e peker på er avhengig av type hendelse : Type hendelse : musebevegelse museklikk, trykk på tast (ned eller opp)... Verdier, f.eks Museposisjon (x,y) i vinduet Hvilken museknapp trykket Hvilken tast trykket Hvilket vinduskomponent på skjermen de4e Mlhører Peker Ml komponent eller tekst Hvordan vet kjøresystemet de4e? 22

Mer om hendelsesmodellen en kø per program Operativsystem (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 objektet. Kaster de objektene ingen vil ha 23

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

VikCgste ly.ergrensesni. Grensesni4 og typen av hendelser MouseListener museklikk MouseMoMonListener musebevegelser AcMonListener Trykk på trykknapper / CR i tekstelt KeyListener Tastetrykk ItemListener Valg i rullegardin + ca 80 andre ly4er- grensesni4 f.eks: ListSelecMonListener, MenuDragMouseListener, MenuKeyListener, MenuListener, MetaEventListener, MouseInputListener, MouseWheelListener, NamespaceChangeListener, NamingListener, NodeChangeListener, ObjectChangeListener, PopupMenuListener, PreferenceChangeListener, PropertyChangeListener, RowSetListener, SSLSessionBindingListener, TableColumnModelListener, TableModelListener, TextListener, WindowFocusListener, WindowListener, WindowStateListener 25

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( Høyre")) {retning = hoyre; else if (s.equals( Venstre")) {retning = venstre; JComboBox styring = new JComboBox (); styring.additem( Opp"); styring.additem( Ned"); styring.additem( Venstre"); styring.additem( Høyre"); styring.seteditable(false); styring.additemlistener(new RulleLytter);... 26

Hvordan lage et ly4eobjekt to måter: 1 Implementere det rikmge grensesni.et (KeyListener, AcMonListener, ItemListener) Husk at da må vi implementere alle metodene i grensesni4et De4e gjør vi som onest bare for noen enkle grensesni4 (der det bare er én metode i hvert grensesni4) : AcMonListener ItemListener NY 2 Lage en ly4erklasse som subklasse av en ferdiglaget klasse som allerede er laget og som implementerer ly4er- grensesni4et De heter alle Adapter (KeyAdapter, MouseAdapter,..) og har implementert tomme metoder for alle metodene i grensesni4et. I en subklasse kan vi da enkelt omdefinere de metodene vi skal bruke (vi slipper å gi kode Ml resten av metodene) 27

KeyAdapter - eksempel Vil ly4e 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å overse4e alt Ml STORE BOKSTAVER i nederste felt 12? 28

KeyListener Metoder i grenseni4et: 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 li4 tungt å implementere dem alle hvis vi bare trenger en eller to) 29

import javax.swing.*; import java.awt.*; import java.awt.event.*; // Husk for hendelseshåndtering class KeyDemo extends JFrame { JLabel ecke. = new JLabel("Overse.er Cl store bokstaver"); JTextField teks[elt = new JTextField(30), svarfelt = new JTextField(30) ; KeyDemo() { super("keydemo"); teks[elt.seteditable(true); svarfelt.seteditable(true); Container lerret = getcontentpane(); setlayout(new GridLayout(3, 1)); add(ecke.); add(teks[elt); add(svarfelt); teks[elt.addkeylistener(new Tast()); setdefaultcloseoperacon(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) { String s = teks[elt.gettext(); svarfelt.settext(s.touppercase()); else { teller++; svarfelt.settext("du har nå trykket på " + teller +" taster"); 30

class Tast extends KeyAdapter { int teller = 0; public void keyreleased (KeyEvent e) { if (e.getkeycode() == KeyEvent.VK_ENTER) { String s = teks[elt.gettext(); svarfelt.settext(s.touppercase()); else { teller++; svarfelt.settext("du har nå trykket på " + teller +" taster"); public stacc void main(string[] args) { new KeyDemo(); svarfelt.seteditable(false); Hvordan er dette mulig? 31

Ferdigprogrammerte vinduer for én opplysning JOpMonPane inneholder en rekke ferdige små- vinduer De er alle modale (systemet henger Ml vi har svart) Klasser som bruker disse bør være subklasse av JComponent Disse finnes i ulike varianter, enkle og mer omfa4ende parametre Problem: Vanskelig å 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); 32

import javax.swing.*; import java.awt.*; class Dialog2Test { Skal alt på norsk må vi bruke OpMonDialog 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, valg, valg[0]); String [ ] svar = { "Greit"; JOptionPane.showOptionDialog(null, "Du oppga: " + valg[i], Melding", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, svar, svar[0]); System.exit(0); 33

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; 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 34

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 35

En Muse- demo et frihånds tegneprogram 36

Spesifikasjon Vi må ly4e på musa (lager 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 musa røres (knapp- nede- trekkes- Ml- ny4- sted), legger vi Ml et ny4 punkt og tegner opp hele kurven om igjen Samme flaten som tegner, kan også ly4e på musa Oppgave 1: Re4 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) 37

import javax.swing.*; import java.awt.*; import java.awt.event.*; class MuseDemo extends JFrame { MuseDemo() { settitle("musedemo"); Muse mus = new Muse(); mus.addmousemoconlistener(mus); add(mus, BorderLayout.CENTER); setdefaultcloseoperacon(jframe.exit_on_close); pack(); setvisible(true); public stacc void main(string[] args) { new MuseDemo(); 38

class Muse extends JPanel implements MouseMoConListener { int [] x = new int[10000], y= new int[10000]; int ant = 0; Muse() { setpreferredsize(new Dimension(500, 500)); // De to metodene i MouseMoConListener: 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]); 39