Grafik: Att "rita" egna komponenter

Relevanta dokument
TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

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

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

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

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

Rita Egna Bilder, Timer

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Exempel på användning av arv: Geometriska figurer

Laboration 3 GUI-programmering

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

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

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

Labbinstruktioner för Java/Swing

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

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

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

TDDD78 Viktiga begrepp, del 2

Lösningsförslag till tentamen

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

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

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

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

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

Laboration 15 Grafiskt användargränssnitt

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

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

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

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

Grafiska komponenter.

ID1004 Laboration 3, 5-6 November 2012

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

Lab5 för prgmedcl04 Grafik

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen i Objektorienterad programmering

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Laboration 4: Game of Life

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lösningsförslag till tentamen

Föreläsning 11. Att rita egna bilder.

Föreläsning 11. Att rita egna bilder. Grafik. Klassen Graphics. Fönstrets koordinatsystem

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

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

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

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

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

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

Lektion Händelsehanterare

För att hitta filen gå till mappen NetBeansProjects. Välj undermappen med rätt projekt, och sedan undermapp dist. Där ligger.jar-filen.

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

Föreläsning 5-6 Innehåll

Transformationer. Translation. Skalning. Homogena koordinater. Rotation. 2D-grafik. x y. Inom datorgrafik är transformationer den. Många. bevaras.

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

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

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

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

Java-concept och Swing. Swing low, sweet chariot

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

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

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

Applets med komponenter

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Föreläsning 2, vecka 8: Repetition

Tentamen i Objektorienterad programmering

Tentamen FYTA11 Javaprogrammering

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

2D-grafik. Gustav Taxén

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

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

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

Föreläsning 13 Innehåll

Tentamen i Objektorienterad programmering E

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

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

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Lösningsförslag till tentamen

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.

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

Lösningar för tenta 3 DAT043,

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

Grafiska användargränssnitt i Java

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Transkript:

jonas.kvarnstrom@liu.se 2016 Grafik: Att "rita" egna komponenter

Intro 1: Rita Allt på skärmen ritas som pixlar Även de vanliga GUI-komponenterna 2 Gradienter, skuggning Matematisk fontkurva görs till pixlar, slätas ut Rundade hörn

Intro 2: Egna komponenter Detta behövs också för att skapa egna komponenter Genomgående exempel: Analog klocka public class ClockComponent extends JComponent { Bakgrund, cirklar, tre visare 3 Projekt: Ofta spel Ofta egen komponent för spel-gui, plus standardkomponenter (menyer osv)

Rita 1: Egen komponent Komponenter: Subklasser till JComponent public class ClockComponent extends JComponent { // Which time should be shown? private LocalTime time; 5 // Construct a clock component public ClockComponent(LocalTime time) { this.time = time; JComponent JTextComponent JButton ClockComponent

Rita 2: Callback-metod 6 Hur kan vi rita en ClockComponent? Liknar ActionListeners: Vi implementerar en callback-metod (i ett objekt) Swing anropar metoden vid behov från händelsehanteringstråden ActionListener actionperformed() JComponent paintcomponent() BoldListener ItalicsListener ClockComponent JButton actionperformed() actionperformed() paintcomponent() paintcomponent() Skillnad: Metoden implementeras direkt i komponentklassen

Rita 3: paintcomponent() 7 Swings händelsehanteringstråd anropar paintcomponent() för att rita upp komponentens innehåll Komponenten definierar hur den ska ritas public class ClockComponent extends JComponent { private LocalTime time; public void paintcomponent(graphics g) { // How should this component look? g.drawoval( coordinates for circle ); g.drawline( coordinates for hours ); g.drawline( coordinates for minutes ); g.drawline( coordinates for seconds ); // Details to follow! Swing ger oss ett Graphics-objekt som kan rita på denna komponent

Rita 4: Swing anropar paintcomponent() Så Swing (inte vi!) anropar paintcomponent(): Den första gången fönstret visas 8 När komponenten visas igen efter att ha varit övertäckt

Rita 5: Vi anropar repaint() Om vi vill uppdatera innehållet: Vi ber Swing att anropa paintcomponent() åt oss 9 public class TextLabel extends JComponent { public void settext(string text) { this.text = text; this.repaint(); Min etikett ändrades be Swing att måla om mig public class GameMechanics { private GameComponent gamecomponent; private void stepgameforward() { moveplayers(); checkcollisions(); gamecomponent.repaint(); När vi vill stega framåt: be Swing att måla om spelkomponenten Lägger en begäran om omritning i "att-göra"-listan Hanteras när det finns tid

Rita 6: Hur stor är jag? Layouthanteraren kan bestämma komponentens storlek Komponenten frågar: "Hur stor är jag?" public class ClockComponent extends JComponent { private LocalTime time; 10 public void paintcomponent(graphics g) { int mywidth = this.getwidth(); int myheight = this.getheight();

Grafik 1: Graphics-klassen 12 Graphics: Begränsad repertoar, en metod per "form" Graphics public class ClockComponent extends JComponent { public void paintcomponent(graphics g) { g.drawoval( coordinates for circle ); g.drawline( coordinates for hours );

Grafik 2: java.awt.graphics2d Nyare subklass Graphics2D: Godtyckliga former Skapa ett Shape-objekt, och anropa: g2.draw(shape s) g2.fill(shape s) För allt som implementerar gränssnittet Shape, även egna former! 13 Graphics Graphics2D Likheter med Pythons grafikpaket och olikheter r = Rectangle(Point(20,20),Point(100,60)) r.draw(win) public void paintcomponent(graphics g) { Graphics2D g2 = (Graphics2D) g; Shape r = new Rectangle2D.Float(20, 20, 80, 40); g2.fill(r); Formen ritar ut sig själv Graphics-objektet ritar formen

Grafik 3: Exempel Rita med Graphics2D 14 Graphics public class ClockComponent extends JComponent { public void paintcomponent(graphics g) { Graphics2D g2 = (Graphics2D) g; Graphics2D Bakåtkompatibilitet: Parameter av typ Graphics Det verkliga värdet är Graphics2D, jag lovar! Shape mycircle = new Ellipse2D.Double( center.x - radius, center.y - radius, 2 * radius, 2 * radius); g2.draw(mycircle); Skapa ett Shape (parametrar av dubbel precision)

Grafik 4: Fördefinierade former Fördefinierade former: Rectangle2D, RoundRectangle2D Rectangle2D.Float och Rectangle2D.Double, etc. 15 Arc2D, Ellipse2D Line2D, QuadCurve2D, CubicCurve2D Area, GeneralPath

Grafik 5: Kollisionsdetektering Former är geometriska, kan testa kollisioner 16 Shape s1 Rectangle2D s2 if (s1.intersects(s2)) { // Collision! = ; = new Rectangle2D.Double(); Användbart för ungefärlig kollisionsdetektering i 2D-spel Även om man inte använder Shapes för att rita Skapa former som motsvarar rörliga eller stationära objekt Använd eventuellt Area-klassen för att kombinera former Se om formerna överlappar

Grafik 6: Text 17 För att rita text: Välj en font (java.awt.font) Plus stil och punktstorlek Font myfont = new Font( Arial", Font.BOLD, 12); g2.setfont(myfont); Font.PLAIN Font.BOLD Font.ITALIC Font.BOLD + Font.ITALIC Använd drawstring() int x = 100; int y = 100; // For the baseline! g2.drawstring( Hello World, x, y); Fontinformation: myfont.getlinemetrics()

Grafik 7: Fonts Vilka fonter finns? Alltid: "Logiska" fontnamn Dialog, DialogInput mappas till: Times? Serif, SansSerif Monospaced, Symbol Helvetica? Broadway? 18 Plus alla installerade fonter public class MyComponent extends JComponent { public void checkfonts() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] names = ge.getavailablefontfamilynames();

Exempel 1: Klockkomponent Klockkomponent: class ClockComponent extends JComponent { private LocalTime time; public ClockComponent(LocalTime time) { this.time = time; public LocalTime gettime() { return time; public void settime(localtime time) { this.time = time; 19

Exempel 2: Klockkomponent 20 public void paintcomponent(graphics g) { "Hur hög och bred är jag, klockan, Graphics2D g2 = (Graphics2D) g; på skärmen?" Point center = new Point(getWidth() / 2, getheight() / 2); // Fill most of the current size, but leave some margins int radius = (int) (0.45 * Math.min(getWidth(), getheight())); // Paint the circle representing the clock g2.draw(new Ellipse2D.Double(center.x - radius, center.y - radius, 2 * radius, 2 * radius)); final double π = Math.PI; drawhand(g2, center, 2 * π * (time.gethour() / 12.0), radius * 2 / 3); drawhand(g2, center, 2 * π * (time.getminute() / 60.0), radius * 9 / 10); drawhand(g2, center, 2 * π * (time.getsecond() / 60.0), radius * 9 / 10); private void drawhand(graphics2d g2, Point center, double angle, int radius) { g2.drawline(center.x, center.y, (int) (center.x + radius * Math.sin(angle)), (int) (center.y - radius * Math.cos(angle))); // Or: g2.draw(new Line2D.Float(center.x, center.y,, ));

Exempel 3: Använda klockkomponent 21 public class Clock { private JFrame frame; private ClockComponent clock; public Clock() { // LocalTime.now(): Static method returning the current time clock = new ClockComponent(LocalTime.now()); frame = new JFrame("Clock"); frame.setlayout(new BorderLayout()); frame.add(clock, BorderLayout.CENTER); frame.setsize(320, 320); frame.setvisible(true); public static void main(string[] args) { new Clock(); Defaultfärg Tunna linjer "Hackiga" linjer

Stilar 1: I Graphics-objektet Pythons grafikpaket: Stilar är del av formen r = Rectangle(Point(20,20),Point(100,60)) r.setfill('green') r.draw(win) 23 Java: Sätt stilen i Graphics-objektet Gäller för allt som målas därefter public void paintcomponent(graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setcolor(); g2.fill(new Rectangle2D.Float(20, 20, 80, 40));

Stilar 2: Pennor och Strokes Byt penna med setstroke() Ändra tjocklek: g2.setstroke(new BasicStroke(width)); 24 Kan kontrollera fler aspekter:

Stilar 3: Färger 25 Färger och fyllmönster implementerar Paint: setpaint() Color: Solid färg Statiska fält för några standardfärger: Color.RED, Color.GREEN, Color.BLACK, Color cyan1 = new Color(0.0, 1.0, 1.0); // Between 0.0 and 1.0 Color cyan2 = new Color(0, 255, 255); // Between 0 and 255

Stilar 4: Gradienter och texturer 26 GradientPaint: En gradient mellan två färger TexturePaint: Repeterar en bild för att fylla en yta

Stilar 5: Genomskinlighet Ibland vill man ha halvgenomskinlig färg g2.setcomposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7) ); 27 Konturer synliga bakom statusinfo

Stilar 6: Antialiasing 28 Antialiasing (kantutjämning) för text g2.setrenderinghint(renderinghints.key_text_antialiasing, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); Antialiasing för icke-text g2.setrenderinghint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

En modifierad klocka 29 public void paintcomponent(graphics g) { g2.setrenderinghint(renderinghints.key_antialiasing, RenderingHints.VALUE_ANTIALIAS_ON); g2.setcolor(color.green); g2.setstroke(new BasicStroke(3.0f)); g2.draw(new Ellipse2D.Double(center.x - radius, center.y - radius, 2*radius, 2*radius)); drawhand(g2, radius * 0.08f, center, 2 * π * (time.gethour() / 12.0), radius * 2 / 3); drawhand(g2, radius * 0.04f, center, 2 * π * (time.getminute() / 60.0), radius * 9 / 10); drawhand(g2, radius * 0.02f, center, 2 * π * (time.getsecond() / 60.0), radius * 9 / 10); private void drawhand(graphics2d g2, float width, Point center, double angle, int radius) { g2.setcolor(color.black); g2.setstroke(new BasicStroke(width)); Ange linjetjocklek Antialiasing på Grön cirkel, tjockare penna

En modifierad klocka (2) Resultat: 30

Regelbundna uppdateringar 1 Än så länge står klockan stilla även om den ritas om För att uppdatera regelbundet: Skapa uppdateringslyssnare // Skapa en klocka clock = new ClockComponent(LocalTime.now()); 32 // Skapa en handling som uppdaterar klockan om och när den anropas final ActionListener updater = new ActionListener() { ; public void actionperformed(actionevent event) { clock.settime(localtime.now()); clock.repaint(); Eller uppdatera ett helt speltillstånd: Flytta spelare ett steg, testa kollisioner, // Var 500:e millisekund, be Swing att "anropa updater så snart som möjligt" // Sker i händelsehanteringstråden clocktimer = new javax.swing.timer(500 /*milliseconds*/, updater); // Om vi är långsamma och en begäran redan ligger i kön: Hoppa över clocktimer.setcoalesce(true); clocktimer.start();

Regelbundna uppdateringar 2 33 import javax.swing.timer; public class Clock02 { private JFrame frame; private ClockComponent clock; private Timer clocktimer; public Clock02() { clock = new ClockComponent(LocalTime.now()); frame = new JFrame("Clock"); frame.setlayout(new BorderLayout()); frame.add(clock, BorderLayout.CENTER); frame.setsize(320, 320); frame.setvisible(true); Olika paket har klasser med samma namn! javax.swing.timer använder Swings händelsehanteringstråd (viktigt i GUI)! final ActionListener updater = new ActionListener() { public void actionperformed(actionevent event) { clock.settime(localtime.now()); clock.repaint(); ; clocktimer = new Timer(500 /*milliseconds*/, updater); clocktimer.setcoalesce(true); clocktimer.start();

Regelbundna uppdateringar 3 34 import javax.swing.timer; public class Clock02 { private JFrame frame; private ClockComponent clock; private Timer clocktimer; public Clock02() { clock = new ClockComponent(LocalTime.now()); frame = new JFrame("Clock"); frame.setlayout(new BorderLayout()); frame.add(clock, BorderLayout.CENTER); frame.setsize(320, 320); frame.setvisible(true); final ActionListener updater = event -> { clock.settime(localtime.now()); clock.repaint(); ; Enklare med lambdafunktion clocktimer = new Timer(500 /*milliseconds*/, updater); clocktimer.setcoalesce(true); clocktimer.start();

Bilder 1: Bildklasser java.awt.image Inkrementell asynkron inläsning, bra för långsamma uppkopplingar Subklasser som BufferedImage tillåter bildmanipulation 36 javax.swing.imageicon implements Icon Enklast möjliga hantering Kan läsas från minnet, filnamn eller URL new ImageIcon(byte[] data) new ImageIcon(String filename) new ImageIcon(URL location) Användbara metoder: int geticonheight() int geticonwidth() void painticon(component c, Graphics g, int x, int y)

Bilder 2: Rita 37 public class IconPainter01 extends JComponent { public void paintcomponent(final Graphics g) { final Graphics2D g2d = (Graphics2D) g; g2d.setrenderinghint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Förklaras senare final ImageIcon icon = new ImageIcon(getClass().getResource("/date.png")); icon.painticon(this, g, 50, 50); public static void main(string[] args) { final JFrame frame = new JFrame("Graphics2D Test"); frame.setlayout(new GridLayout(1,1)); frame.add(new IconPainter()); frame.setsize(300, 300); frame.setvisible(true); Bilden fick inte plats

Bilder 3: Skala med en transform 38 public class IconPainter02 extends JComponent { public void paintcomponent(final Graphics g) { final Graphics2D g2d = (Graphics2D) g; g2d.setrenderinghint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); final ImageIcon icon = new ImageIcon(getClass().getResource("/javatut.jpg")); final AffineTransform old = g2d.gettransform(); final AffineTransform at = AffineTransform.getScaleInstance(0.5, 0.5); g2d.settransform(at); icon.painticon(this, g, 50, 50); g2d.settransform(old); Sätt en transform(ation) på allt som ritas upp: Skalning faktor 0.5 Även positionen (50,50) skalades ner!

Bilder 4: Skalning + koordinater 39 Transformation i flera steg final AffineTransform old = g2d.gettransform(); final AffineTransform at = AffineTransform.getScaleInstance(1,1); // Steg 4: Gör ingenting (skala faktor 1) at.translate(50,50); // Steg 3: Flytta (i "oskalade" koordinater) at.scale(0.5, 0.5); // Steg 2: Skala ner alla koordinater g2d.settransform(at); icon.painticon(this, g, 0, 0); // Steg 1: Starta på (0,0) g2d.settransform(old);

Bilder 5: Rotation 40 final AffineTransform old = g2d.gettransform(); final AffineTransform at = AffineTransform.getScaleInstance(1,1); at.translate(50,50); at.scale(0.5, 0.5); at.rotate(math.pi/4); g2d.settransform(at); icon.painticon(this, g, 0, 0); g2d.settransform(old); Först: Rotation runt övre vänstra punkten

Resurser 1: Data på samma plats som kod Hur kan programmet hitta sina egna bildfiler, ljudfiler, osv? Program kan installeras på olika platser, särskilt med olika OS Hela programmet kan packas i en JAR-fil Java Archive, i princip en ZIP-fil 41 Resurser laddar data på samma sätt som kod Placera data "bredvid" koden Använd resurser för att ladda in dem Allt i en enda JAR-fil: mypackage/main.class mypackage/showimage.class data/bin.dat img/test.png

Resurser 2: Exempel 42 Måste ha en ClassLoader eller en Class Enklast: SomeClassInYourProgram.class Sedan ger getresource() ett URL-objekt public class Main { public void getimage() { URL url = Main.class.getResource("img/test.png"); ImageIcon img = new ImageIcon(url); Inte ett filnamn:.class är specialsyntax Låt ImageIcon-klassen läsa från given URL public void getdata() { URL url = Main.class.getResource("data/bin.dat"); InputStream is = url.openstream(); //... Exempel: jar:file:/c:/devel/teach/java/out/artifacts/ SlideSource_jar/SlideSource.jar!/img/test.png Öppna, och läs som från en vanlig fil (senare!) mypackage/main.class mypackage/showimage.class data/bin.dat img/test.png

Resurser 3: Vilka filer? I IDEA kan man ange vilka filer som är resurser 1) Placera under source-mappen; ange namnmönster (?*.jpg;?*.png) 43 2) Placera i annan mapp; högerklicka; "mark directory as / resources root" Vid kompilering inkluderar IDEA de utvalda filerna Annat kommer inte med i programmet

Ljud i Java jonas.kvarnstrom@liu.se 2016

Att spela enkla ljud Spela och loopa ljud: public class SoundPlayer2 { // Ett Clip strömmas inte utan läses i sin helhet private final Clip beepsound; public SoundPlayer2() throws { URL url = SoundPlayer2.class.getResource("/sounds/beep-01a.mp3"); if (url == null) { /* Signalera fel */ 45 beepsound = AudioSystem.getClip(); beepsound.open(audiosystem.getaudioinputstream(url)); public void beeponce() { beepsound.start(); public void beeptwice() { beepsound.loop(1); Finns mycket mer: Sampling, behandling, mixer, Se http://docs.oracle.com/javase/tutorial/sound/index.html