_ Allmänna frågor __ Fråga/svar 1 Hur når knapparna i min §JPanel x§ textfälten i §JPanel y§? Följande exempelprogram visar hur man kan referera till olika saker. Konstruktorn hos knappen §JB§ tar emot en referens §jf§ från ramen §JF§ som knappen ligger i och att denna ram har knapparna definierade som instansvariabler (inte riktigt snyggt, variablerna borde vara modifierade §private§ och man ska nå dem via metoder): § import java.awt.event.*; import javax.swing.*; import java.util.Random; public class JF extends JFrame { JB jb1, jb2; public static void main(String[] args) { new JF(); } public JF() { jb1 = new JB(this); jb2 = new JB(this); getContentPane().add("North", jb1); getContentPane().add("South", jb2); setSize(100, 100); show(); } } class JB extends JButton implements ActionListener { Random rnd = new Random(); JF jf; public JB(JF jf) { this.jf = jf; addActionListener(this); } public void actionPerformed(ActionEvent ea) { if(ea.getSource() == jf.jb1) jf.jb2.setText("Slump: " + rnd.nextInt(5)); else jf.jb1.setText("Slump: " + rnd.nextInt(5)); } } § Om vi har exempelvis en §JButton draw§ som vid tryck skall rita om en §JPanel§ så måste denna knapp ha en referens §x§ till §JPanel§:en för att kunna nå dennas §repaint§-metod: §x.repaint();§. __ Fråga/svar 2 Jag får felet: §Can't make a static reference to nonstatic variable x in class MyFrame§. Vad gör jag för fel och vad betyder egentligen §static§? Metoden §main§ är deklarerad §static§ vilket betyder att den ska kunna anropas utan att man först skapat en instans av klassen. Detta betyder att om man i §main§ vill använda sig av variabler deklarerade utanför §main§ så måste även dessa vara deklarerade §static§, det vill säga tillhöra klassen, eftersom man ska kunna använda §main§ utan att något objekt skapats. Eftersom §x§ nedan är en instans-variabel (inte en klass-variabel), det vill säga tillhör ett specifikt instansierat objekt, så går följande inte att kompilera: § public class MyClass { int x = 10; public static void main(String[] args) { System.out.println("x: " + x); } } § Följande går fint eftersom §x§ här endast gäller internt i §main§-metoden: § public class MyClass { public static void main(String[] args) { int x = 10; System.out.println("x: " + x); } } § Även följande går bra eftersom §x§ själv är deklarerad §static§, det vill säga §x§ tillhör klassen: § public class MyClass { static int x = 10; public static void main(String[] args) { System.out.println("x: " + x); } } § __ Fråga/svar 3 Hur tar man reda på vilken typ av objekt som är lagrat på ett visst ställe i en §Vector§? I klassen §Object§ finns metoden §getClass§ som returnerar ett objekt av typen §Class§. I klassen §Class§ finns metoden §getName§ som returnerar en §String§. Ett enkelt exempel: § import java.util.*; public class T7 { public static void main(String[] args) { Vector v = new Vector(); v.add(new Double(1.234)); v.add(new Integer(1)); for(int i = 0; i < v.size(); i++) System.out.println(v.elementAt(i).getClass().getName()); } } § Kom ihåg att använda: §string1.equals(string2)§ om man ska jämföra två strängar (inte: §string1 == string2§). __ Fråga/svar 4 Hur får man, i en applikation, in en bild i en §JPanel§? Betrakta följande exempel: § import java.awt.*; import javax.swing.*; class ImagePanel extends JPanel { Image i = Toolkit.getDefaultToolkit().getImage("smiley.gif"); public ImagePanel() { MediaTracker tracker = new MediaTracker(this); tracker.addImage(i, 0); try { tracker.waitForID(0); } catch (InterruptedException e) {} } public void paintComponent(Graphics g) { g.drawImage(i, 0, 0, getSize().width, getSize().height, this); } } public class I extends JFrame { public I() { setSize (100, 100); getContentPane().add(new ImagePanel()); show(); } public static void main(String[] args) { new I(); } } § Observera! - Ordningen på metodanropen i klassen §I§:s konstruktor är viktig - Bildfilen i detta exempel heter §smiley.gif§ och som det ser ut ovan så måste den ligga i samma katalog som programmet gör __ Fråga/svar 5 Hur får man, i ett äpple, in en bild i en §JPanel§? Betrakta följande exempel: § import java.awt.*; import javax.swing.*; class ImagePanel extends JPanel { Image i; public ImagePanel(Image i) { this.i = i; } public void paintComponent(Graphics g) { g.drawImage(i, 0, 0, getSize().width, getSize().height, this); } } public class I extends JApplet { public void init() { setSize (100, 100); Image i = getImage(getCodeBase(), "smiley.gif"); MediaTracker tracker = new MediaTracker(this); tracker.addImage(i, 0); try { tracker.waitForID(0); } catch (InterruptedException e) {} getContentPane().add(new ImagePanel(i)); } } § Observera! Det är, som synes, ganska stor skillnad mellan hur man gör för applikationer och äpplen. __ Fråga/svar 6 Jag får inte mitt äpple att reagera på tangetbordet, vad gör jag för fel? Betrakta följande exempel: § import java.awt.event.*; import javax.swing.*; public class MyApplet extends JApplet { public void init() { setSize(100, 100); addKeyListener(new L1()); requestFocus(); } public void start() { } class L1 extends KeyAdapter { public void keyPressed(KeyEvent ke) { System.out.println("A key was pressed!"); getToolkit().beep(); } } } § Det fungerar i både appletviewer och i en webbläsare. Det är viktigt att man gör §requestFocus§ på den komponent som har §Key§-lyssnarna, i det här fallet äpplet självt. __ Fråga/svar 7 Hur får man §åäöÅÄÖ§ i kommandofönstret på Windows? Gör följande steg: - Klicka på §Properties§ på ikonen för kommandofönstret - Under §Font§, välj §Lucida Console§ - Starta kommandofönstret och skriv §chcp 1252§ __ Fråga/svar 8 Hur använder man tillbehör i Java? Det finns ett stort antal tillbehör till de tre huvudversionerna (Java ME, Java SE, Java EE). Dessa tillbehör kallas för standard extensioner eller extra paket och är utbyggnader som finns inom många olika områden, exempelvis säkerhet och media. För att använda ett tillbehör så går man till Oracles eller någon annan leverantörs sida på Internet och hämtar en eller flera filer. Det finns två huvudtyper av tillbehör: - Plattformsoberoende som är gjorda enbart med Java - Plattformsberoende som är gjorda med Java och native kod Plattformsberoende tillbehör används för saker där effektiviteten är viktig eller om tillbehöret måste nå plattformsspecifik hårdvara som i exempelvis vid användande av 3D-grafik och/eller andra mediatekniker. Det finns tre huvudsätt att köra Java-program: - Fristående program - Äpplen - Web Start Varje sätt använder tillbehör på sitt eget speciella sätt och sammanfattningsvis kan man använda tillbehör på följande sätt: - Fristående program: -- Plattformsoberoende tillbehör: --- Tillbehöret läggs i speciella kataloger --- Tillbehöret ligger på ett godtyckligt ställe och man sätter §classpath§ dit --- Tillbehöret ligger på samma ställe som huvudprogrammet -- Plattformsberoende tillbehör: --- Tillbehöret läggs i speciella kataloger --- Tillbehöret ligger på samma ställe som huvudprogrammet - Äpplen: -- Plattformsoberoende tillbehör: --- Tillbehöret läggs i speciella kataloger --- Tillbehöret ligger på samma ställe som huvudprogrammet -- Plattformsberoende tillbehör: --- Tillbehöret läggs i speciella kataloger - Web Start: -- Plattformsoberoende tillbehör: --- Tillbehöret läggs i speciella kataloger --- Tillbehöret ligger på samma ställe som huvudprogrammet -- Plattformsberoende tillbehör: --- Tillbehöret läggs i speciella kataloger Vi ska inte gå in på alla detaljer om detta men titta lite generellt på de tre olika huvudsätten att använda tillbehör. _____ Tillbehöret läggs i speciella kataloger Jar- och eventuella dll- (eller motsvarande) filer placeras enligt: - Jar-filer läggs här:  -- För att kunna köra program (JRE): §\Java\jre1.7.0\lib\ext§ -- För att kunna utveckla program (kompilera mm) (JDK): §\jdk1.7.0\lib§  - Dll-filer (eller motsvarande) läggs här:  -- För att kunna köra program (JRE): §\Java\jre1.7.0_04\bin§ Notera att sökvägarna ovan kan vara olika på olika maskiner. När jar- och dll- (eller motsvarande) filer ligger på dessa ställen behöver man inte sätta §classpath§ till dessa filer för att kunna köra och utveckla program som är beroende av tillbehöret. _____ Tillbehöret ligger på ett godtyckligt ställe och man sätter §classpath§ dit Om filerna ligger på andra ställen än beskrivet ovan så kan man sätta omgivningsvariabeln §classpath§ till antingen: - en katalogstruktur med class-filer, eller - en eller flera jar-filer Genom att sätta §classpath§ så berättar man för programmen §javac§, §java§ med flera var detta tillbehör finns. Notera att man även kan sätta §classpath§ direkt när man använder §javac§ eller §java§. _____ Tillbehöret ligger på samma ställe som huvudprogrammet Man kan slutligen lägga tillbehöret på samma ställe som huvudprogrammet. Är tillbehöret packat i en jar-fil så packar man upp det i denna katalog. Mer tydligt, antag att man har sina Java-program här: - §C:\x\y§ Då ska man lägga tillbehörskatalogen §z§ här: - §C:\x\y\z§ En nackdel med detta sätt är att man måste ha flera kopior av tillbehöret om man ska använda det på flera ställen.