Grafiska användargränssnitt i Java

Relevanta dokument
Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Java-concept och Swing. Swing low, sweet chariot

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Händelsestyrda program

Mer om grafiska komponenter. Händelsestyrda program

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Lektion Händelsehanterare

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Frames, menyer och GUI-program

Föreläsning 3: Händelsestyrda program och användargränssnitt

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

OOP Objekt-orienterad programmering

Laboration 15 Grafiskt användargränssnitt

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

OOP Objekt-orienterad programmering

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Fönstersystem. Objektorientering och händelsebaserad programmering. Applikation. Interaktionstoolkit. Händelsehanterare och grafiktoolkit

Projekt 2 XL. Observer-mönstret

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

1 Grafiska komponenter

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

GUI-programmering. Gustav Taxén Martin Berglund DH2640 Grafik och Interaktionsprogrammering VT 2008

Malmö högskola 2007/2008 Teknik och samhälle

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Grafiska användargränssitt och händelsehantering

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

Objektorienterad Programmering DAT043. Föreläsning 6 30/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Programstyrd / händelsestyrd

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen FYTA11 Javaprogrammering

Arv och Grafiska Användargränssnitt

Lab5 för prgmedcl04 Grafik

Grafiska komponenter.

MVC-mönstret. model-view-control i Swing

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

Efterhand fick vi ett system som vi tyckte var väl anpassat. Vi renskrev kladden (nedan) och började programmera menyerna.

Tentamen i Objektorienterad programmering

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Fönsterhantering, grafik

Lösningar för tenta 3 DAT043,

Föreläsning 13: Swing (GUI), händelser, timer

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

725G61 - Laboration 8 Ett enkelt GUI. Sahand Sadjadee och Johan Falkenjack

Laboration 24 Databasen MySQL och java

Malmö högskola 2007/2008 Teknik och samhälle

Lösningsförslag till tentamen

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 5. Laboration 4 Lådplanering Exempel på grafik, ett avancerat program Frågor

Kort om klasser och objekt En introduktion till GUI-programmering i Java

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Malmö högskola 2007/2008 Teknik och samhälle

Föreläsning 14: Grafik & mera händelsehantering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

ID1004 Laboration 3, 5-6 November 2012

5 Användargränssnitt. 5.1 AWT och Swing

Labbinstruktioner för Java/Swing

Modellsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Vad är ett Framework? 2203$ ) UHOlVQLQJ. Hollywood. Frameworks (FW) Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java

Tentamen FYTA11 Javaprogrammering

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Properties. Användbara metoder som kan anropas i propertychanged:

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Laboration 4: Game of Life

DAT043 - föreläsning 8

Lösningsförslag till tentamen FYTA11 Javaprogrammering

PROGRAMMERINGSTEKNIK TIN212

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Tentamen i Objektorienterad programmering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Arv, Grafiska användaregränssnitt och Inre klasser! Förelasning 12!! TDA540 Objektorienterad Programmering!

Föreläsning 15: Repetition DVGA02

Föreläsning 10. ADT:er och datastrukturer

Rita Egna Bilder, Timer

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag 00 - juni - 17 Tentamen i Objektorientering och Java Skrivtid 5 h

Exempel på användning av arv: Geometriska figurer

Transkript:

jonas.kvarnstrom@liu.se 2016 Grafiska användargränssnitt i Java En genomgång av de viktigaste begreppen

Alternativ 2 Från början fanns AWT, Abstract Window Toolkit Till stor del ersatt av Swing: Mer omfattande, mer flexibelt Passar bra för våra behov Illustrerar begrepp som är vanliga i GUI-programmering Nytt alternativ: JavaFX Helt annan struktur (scenes, stages, nodes)

Del 1: Att använda Swing: Fönster, knappar, menyer, Layout (placering) Händelsehantering någon tryckte en knapp" Genomgående exempel: "Ordbehandlare" Del 2: Att rita på skärmen, i en egen komponent

Att öppna ett fönster 5 Fönster: JFrame public class WordProcessor01 { private JFrame frame; http://docs.oracle.com/javase/tutorial/ uiswing/components/frame.html Ordbehandlaren behöver komma ihåg sitt fönster public WordProcessor01() { this.frame = new JFrame("Word Processor 1.0"); frame.setsize(640, 300); Sätt fönsterstorleken, frame.setvisible(true); se till att fönstret visas på skärmen public static void main(string[] args) { new WordProcessor01(); Skapa ett objekt, glöm bort det, och avsluta? Konstruktorn för JFrame "registrerar" fönstret det glöms inte bort Så länge det finns ett öppet fönster, avslutas inte Java!

Komponenter och behållare 6 En JFrame är: http://docs.oracle.com/javase/tutorial/ uiswing/components/frame.html En komponent Något grafiskt som visas på skärmen En behållare (container) Något som kan innehålla andra komponenter Fönstertitel Menyrad Kan läggas till vid behov Innehåll: Content pane Hela fönstrets innehåll. utom titelrad / menyrad

Komponenter Istället för att "rita": Säg till vilka komponenter som ska finnas Menyer, knappar, textfält, statusrad Swing sköter om utseende (med mera) 8 Alla komponenter: https://docs.oracle.com/javase/tutorial/uiswing/components/componentlist.html

Knappar i Java 9 http://docs.oracle.com/javase/tutorial/ uiswing/components/button.html http://docs.oracle.com/javase/tutorial/ uiswing/components/buttongroup.html Grunden för Swing-komponenter Gemensam implementation: Knappar Radioknappar: Bara en aktiv åt gången i varje ButtonGroup Har två lägen, av/på Standardknapp Checkbox, av/på

Textkomponenter 10 http://docs.oracle.com/javase/tutorial/ uiswing/components/text.html Editera text med flera stilar: HTML, Abstrakt, gemensam funktionalitet En enda rad text Textarea med flera rader Speciell formattering för datum, valuta, Lösenord syns inte när de skrivs in

Ordbehandlare med komponenter 11 public class WordProcessor02 { private JFrame frame; http://docs.oracle.com/javase/tutorial/ uiswing/components/label.html public WordProcessor02() { this.frame = new JFrame("Word Processor 1.0"); frame.add(new JButton("B")); frame.add(new JButton("I")); frame.add(new JButton("U")); frame.add(new JButton("Left")); frame.add(new JButton("Center")); frame.add(new JButton("Right")); frame.add(new JButton("Print")); frame.add(new JTextPane()); frame.add(new JLabel("Status: OK")); // JLabel visar text, kan inte editeras frame.pack(); frame.setvisible(true); public static void main(string[] args) { new WordProcessor02(); Lägger till flera komponenter till behållaren fönstret Inget syns på skärmen än! NU är det dags att visa fönstret och dess innehåll

Hålla reda på komponenter 12 public class WordProcessor02b { private JFrame frame; private JTextPane text = new JTextPane(); private JLabel status = new JLabel("Status: OK"); public WordProcessor02b() { this.frame = new JFrame("Word Processor 1.0"); frame.setlayout(new FlowLayout()); frame.add(new JButton("B")); frame.add(new JButton("I")); frame.add(new JButton("U")); frame.add(new JButton("Left")); frame.add(new JButton("Center")); frame.add(new JButton("Right")); frame.add(text); frame.add(status); frame.pack(); frame.setvisible(true); public static void main(string[] args) { new WordProcessor02b(); http://docs.oracle.com/javase/tutorial/ uiswing/components/label.html Behåll pekare till det du vill kunna komma åt igen senare (plocka ut texten för att spara den, )

Resultat 13 Resultat: Rätt komponenter Fel layout Liten textarea

Layout 1: Önskemål Hur får vi önskad layout (positioner och storlek)? 15 JButton JButton JButton JButton JTextPane JButton JFrame Content Pane JLabel

Layout 2: Absoluta koordinater? 16 Absoluta koordinater? component.setsize(int width, int height); component.setlocation(int x, int y); // Från behållarens övre vänstra hörn Fördelar / nackdelar: (+) Enkelt att förstå ( ) Inget stöd för att ändra fönsterstorlek ( ) Hur hanterar man större text? ( ) Översättningar till andra språk, där ord kan ta mer plats? Tools / Инструменти URL / nettadresse

Layout 3: Önskad storlek 17 Preferred Size http://docs.oracle.com/javase/tutorial/ uiswing/layout/index.html Komponenter kan tala om sin önskade storlek (preferred size) JButton: Storlek på texten i inställd fontstorlek + lite marginaler Ingen text inskriven preferred size är minimal! Varje behållare har en layouthanterare (layout manager) Frågar subkomponenter hur stora de vill vara Applicerar layoutregler (här: "Allt i en rad") Summerar, beräknar behållarens önskade storlek

Layout 3: Innehållshierarkin 18 Anropa pack() i ett fönster (frame) Så frågar den sin layouthanterare hur mycket plats den behöver använd den storleken! Fönster Menyrad ContentPane Meny: File Meny: Edit Meny: Help Knapp1 Knapp2 Textfält Statusrad Val1 Val2 Val3

Layout 4: Annan storlek än önskad 19 När en komponent får annan storlek än den begärda: Layouthanteraren har regler för hur utrymmet ska användas Extra utrymme på höjden: Ska användas till textarean Extra utrymme på bredden: Menyrad: Extra plats mellan Edit och Help Knapprad: Allt vänsterjusterat Textfält, statusrad: Använder hela utrymmet Just nu:

MigLayout 1: Introduktion 20 MigLayout rekommenderas starkt! Nu: De enklaste funktionerna Se http://www.miglayout.com/quickstart.pdf, http://www.migcalendar.com/miglayout/mavensite/docs/cheatsheet.html Baserad på rutnät

MigLayout 2: Rutor Komponenter använder en eller flera rutor 21 B I U Left Cent er Right Print Textarea Statusrad

MigLayout 3: Anpassning Kolumnbredder och radbredder anpassas till komponenterna Ange vilka celler som ska använda "överbliven plats" 22 B I U Left Center Right Print Textarea Statusrad

MigLayout 4: Hur får cellerna växa? 23 public WordProcessor03() { this.frame = new JFrame("Word Processor 1.0"); frame.setlayout(new MigLayout( "", // Allt, globalt "[][][][][][][grow]", // Varje kolumn (7 st) sista kolumnen får växa "[][grow][]" // Varje rad (3 st) mittersta får växa )); B I U Left Center Right Print Textarea Statusrad

MigLayout 5: Ordbehandlaren 24 public WordProcessor04() { this.frame = new JFrame("Word Processor 1.0"); frame.setlayout(new MigLayout("", "[][][][][][][grow]", "[][grow][]")); frame.add(new JButton("B")); frame.add(new JButton("I")); frame.add(new JButton("U"), frame.add(new JButton("Left")); frame.add(new JButton("Center")); frame.add(new JButton("Right"), frame.add(new JButton("Print"), frame.add(text, frame.add(status, "gapright unrelated"); "gapright unrelated"); "wrap"); "span 7, grow, wrap"); "wrap"); Separation Avsluta "gruppen": Mellanrum till höger, lagom för "orelaterad component" Wrap: Radbyte Span, grow: Storlek Span: 7 rutor frame.pack(); frame.setvisible(true); Grow: Låt textrutan växa sig större än nödvändigt

Scrollning Textfältet måste kunna scrollas Inte "inbyggt" i JTextPane lägg den i en JScrollPane public WordProcessor04() { frame.add(text, "span 7, grow, wrap"); 25 public WordProcessor05() { frame.add(new JScrollPane(text), "span 7, grow, wrap"); Fönster Knappar JScrollPane Statusrad http://docs.oracle.com/javase/tutorial/ uiswing/components/scrollpane.html Textfält

Menyraden Menyer hanteras (lite) annorlunda Läggs inte till direkt i fönstret, utan i dess menyrad 27 Fönstertitel Menyrad Innehåll: Content pane

Uppdelning Vi lägger menyhanteringen i en egen metod 28 public WordProcessor06() { this.frame = new JFrame("Word Processor 1.0"); frame.setlayout(new MigLayout("", "[][][][][][][grow]", "[][grow][]")); createmenus(); frame.add(.); frame.pack(); frame.setvisible(true); private void createmenus() { public static void main(string[] args) { new WordProcessor06();

Att skapa menyer 29 private void createmenus() { final JMenuBar bar = new JMenuBar(); final JMenu file = new JMenu("File"); file.add(new JMenuItem("Open", 'O')); file.add(new JMenuItem("Save As", 'A')); file.addseparator(); file.add(new JMenuItem("Print")); bar.add(file); final JMenu edit = new JMenu("Edit"); edit.add(new JMenuItem("Cut")); edit.add(new JMenuItem("Copy")); edit.add(new JMenuItem("Paste")); bar.add(edit); // Understruket O // Separator final JMenu help = new JMenu("Help"); help.add(new JMenuItem("About WordProcessor 1.0")); bar.add(box.createhorizontalglue()); bar.add(help); frame.setjmenubar(bar); http://docs.oracle.com/javase/tutorial/ uiswing/components/menus.html, separator.html Separering Skapar en osynlig komponent, 0 pixel hög, godtyckligt bred

Händelsehantering: Principer Hur vet vi när någon tryckte på en knapp? TDDD73: Vänta på ett klick Måste veta när det kan hända Måste hantera allt själva koordinater, 31

Händelsehantering: Principer (2) I många grafiska gränssnitt: Säg till systemet vad det ska göra när en knapp trycks Fortsätt själv med något annat När knappen trycks hanteras detta asynkront i en annan tråd 32 Som om du har en assistent som hjälper till Du säger: "Om knappen trycks, gör detta" Assistenten håller koll på inmatning Ser att knappen trycktes in, gör vad du bad om

Lyssnare 1: Gränssnitt och implementation Hur representerar vi vad assistenten ska göra? Vi ger assistenten ett objekt, en lyssnare När något händer anropar assistenten en metod i lyssnaren 33 Det finns redan många gränssnitt för lyssnare exempel: public interface MouseListener extends EventListener { Vi får själva implementera gränssnitten public class ClickPrinter implements MouseListener { public void mouseclicked(mouseevent e) { System.out.println("Hey! Someone clicked!"); public void mouseclicked(mouseevent e); public void mousepressed(mouseevent e);

Lyssnare 2: Registrering Varje komponent har en egen lista på lyssnare // Existerande klass i Swing (något förenklat ) public class Component { private List<MouseListener> mouselisteners; public void addmouselistener(mouselistener ml) { mouselisteners.add(ml); Vi kan lägga till vår egen lyssnare till en komponent // Vår egen klass public class MyGUI { private JFrame frame = ; public MyGUI() { MouseListener ml = new ClickPrinter(); frame.addmouselistener(ml); // Vårt jobb är klart assistenten tar hand om händelserna 34

Lyssnare 3: När något händer När någon klickar med musen: Java får "rå" input från operativsystemet I en händelsehanteringstråd i bakgrunden ("assistenten") Skapar ett objekt som beskriver händelsen: MouseEvent, KeyEvent, 35 public class MouseEvent extends InputEvent { int x; // Koordinater int y; int clickcount; // Hur många gånger klickade de? int button; // Med vilken musknapp?

Lyssnare 4: När något händer När någon klickar med musen: Java får "rå" input från operativsystemet I en händelsehanteringstråd i bakgrunden ("assistenten") Skapar ett objekt som beskriver händelsen: MouseEvent, KeyEvent, 36 Skickar händelsen till den relevanta komponenten Komponenten informerar (anropare en metod i) varje lyssnare for (MouseListener ml : this.mouselisteners) { ml.mouseclicked(event); Inkluderar vår registrerade ClickPrinter public class ClickPrinter implements MouseListener { public void mouseclicked(mouseevent e) { System.out.println("Hey! Someone clicked!");

Lyssnare 5: Nästlad klass Bekvämlighet: Kan lägga en klass inuti en annan, nästlat Färre filer att hålla reda på Lyssnarklassen behöver inte "synas" utåt public class MyGUI { public MyGUI() { MouseListener ml = new ClickPrinter(); frame.addmouselistener(ml); // Vårt jobb är klart assistenten tar hand om händelserna 37 private class ClickPrinter implements MouseListener { public void mouseclicked(mouseevent e) { System.out.println("Hey! Someone clicked!");

ActionListener 1: Introduktion Vanlig och enkel lyssnare: ActionListener Anger vad som ska göras när någon vill "utföra en handling" 38 Menyval Knapptryck Dubbelklick i lista package java.awt.event; import java.util.eventlistener; public interface ActionListener extends EventListener { /** Invoked when an action occurs. */ public void actionperformed(actionevent e);

ActionListener 2: Exempel 39 public class WordProcessor07 { private JTextPane text = new JTextPane(); public WordProcessor07() { final JButton bold = new JButton("B"); bold.addactionlistener(new BoldListener(text)) frame.add(bold); Skapa knapp Ge den en lyssnare Lägg till den i fönstret Menyer hanteras på samma sätt private class BoldListener implements ActionListener { private final JTextPane text; public BoldListener(final JTextPane text) { this.text = text; Håll reda på textkomponenten public void actionperformed(final ActionEvent e) { text.getstyleddocument().setcharacterattributes(...); Om/när vi anropas: Manipulera textkomponenten

ActionListener 3: Förenklat mellansteg 40 public class WordProcessor08 { private JTextPane text = new JTextPane(); public WordProcessor08() { final JButton bold = new JButton("B"); bold.addactionlistener(new BoldListener()) frame.add(bold); private class BoldListener implements ActionListener { @Override public void actionperformed(final ActionEvent e) { text.getstyleddocument().setcharacterattributes(...); Inre klasser kan komma åt fält i yttre klasser

ActionListener 4: Metodreferens 41 public interface ActionListener extends EventListener { public void actionperformed(actionevent e); 1. ActionListener har en enda metod public class WordProcessor10 { public WordProcessor10() { final JButton bold = new JButton("B"); bold.addactionlistener(this::makebold); frame.add(bold); 3. Ange en referens till den metoden! Kompilatorn ser till att det skapas ett objekt av ActionListener-typ, som anropar makebold() private void makebold(actionevent e) { text.getstyleddocument().setcharacterattributes(...); 2. Implementera en metod med samma parametrar

Några viktiga lyssnarklasser 42 ActionListener Knapp tryckt, menyval gjort, AdjustmentListener Slider eller scrollbar flyttad ItemListener Markering i lista MouseListener Musknappar MouseMotionListener Förflyttning av muspekare KeyListener Tangent tryckt / släppt, tecken skrivet Skickas till komponenten som har tangentbordsfokus Komplicerat ofta är key bindings bättre

Tangentbordsbindningar KeyStroke: En kombination av tangenter (X, Ctrl-Shift-Z, ) 43 Varje komponents InputMap gör om KeyStrokes till namn på handlingar Namnet på en handling ("flyttaåtvänster") Varje komponents ActionMap mappar namnet till ett handlingsobject Action: Kod att utföra

Tangentbordsbindningar: Exempel 44 public class WordProcessor20 { private JFrame frame; public WordProcessor20() { this.frame = new JFrame("Word Processor 1.0"); JComponent pane = frame.getrootpane(); Kan ta getrootpane() eller en annan komponent som ligger i fönstret final InputMap in = pane.getinputmap(jcomponent.when_in_focused_window); in.put(keystroke.getkeystroke("alt F4"), "quit"); final ActionMap act = pane.getactionmap(); act.put("quit", new QuitAction()); private class QuitAction extends AbstractAction { @Override public void actionperformed(final ActionEvent e) { System.exit(0); När fokus är i samma fönster som komponenten, och man trycker Alt F4: "quit" När man får "quit": Utför denna handling Här definieras själva handlingen (ungefär som en lyssnare)

Tangentbordsbindningar: Länkar Mer information: https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html https://docs.oracle.com/javase/8/docs/api/javax/swing/keystroke.html 45

Att stänga ett fönster För att stänga ett fönster: Anropa frame.dispose() 47 För att bestämma vad stäng-knappen gör: Använd myframe.setdefaultcloseoperation(x), där x är WindowConstants.HIDE_ON_CLOSE (default, gömmer bara fönstret) WindowConstants.DO_NOTHING_ON_CLOSE WindowConstants.DISPOSE_ON_CLOSE WindowConstants.EXIT_ON_CLOSE

WindowListener För att lägga till en "är du säker?"-fråga: Använd DO_NOTHING_ON_CLOSE Lägg till en WindowListener som gör det verkliga jobbet 48 package java.awt.event; public interface WindowListener extends EventListener { public void windowopened(windowevent e); public void windowclosing(windowevent e); public void windowclosed(windowevent e); public void windowiconified(windowevent e); public void windowdeiconified(windowevent e); public void windowactivated(windowevent e); public void windowdeactivated(windowevent e); Anropas när stängknappen trycks

WindowAdapter För bekvämlighet: Utöka istället WindowAdapter Tomma dummy-implementationer av alla metoder 49 package java.awt.event; public class WindowAdapter implements WindowListener { public void windowopened(windowevent e) { public void windowclosing(windowevent e) { public void windowclosed(windowevent e) { public void windowiconified(windowevent e) { public void windowdeiconified(windowevent e) { public void windowactivated(windowevent e) { public void windowdeactivated(windowevent e) {

Exempel: Dialogruta 50 public class AskBeforeClosing { private JFrame frame; public AskBeforeClosing() { this.frame = new JFrame("Try to close me"); frame.setdefaultcloseoperation(windowconstants.do_nothing_on_close); frame.addwindowlistener(new CloseButtonHandler()); private class CloseButtonHandler extends WindowAdapter { public void windowclosing(final WindowEvent e) { int answer = JOptionPane.showConfirmDialog (frame, "Do you really want to quit?", "Quit?", JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { System.exit(0); // Avsluta hela Java-processen

Mer om dialogrutor Standardiserade dialoger: JOptionPane Enkel fråga: String input = JOptionPane.showInputDialog("Please input a value"); 51 Kan ange ett fönster som äger dialogen Blockerar inmatning till fönstret JOptionPane.showMessageDialog(frame, "Eggs aren't supposed to be green."); Kan ge fler parametrar JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane warning", JOptionPane.WARNING_MESSAGE); Se http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html, http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html, http://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html