Java: Föreläsning 3

Innehåll i föreläsning 3

Fönster i Java: Utveckling

Versionsnumren på Java är lite röriga

Företaget Sun hittade på Java. Det finns olika implementationer av Java, men Suns egen är "referensimplementationen". Utvecklingspaketet brukar kallas JDK, Java Development Kit. (Kallades ett tag för SDK.) JDK-utgåvorna från Sun har versionsnumren 1.0, 1.1, 1.2 och så vidare upp till 1.6. Det är inte bara nya programversioner, utan även själva språket Java har utvecklats och förändrats.

Stor förändring i Java 1.2, kanske främst just det nya fönsterpaketet Swing. Därför kallades Java 1.2 (och ett tag framåt) för Java 2. 1.5 kallades "Java 5.0", och 1.6 kallas "JDK 6".

Kom ihåg: Det finns tre sorters Java. I samband med Java 2 (dvs, version 1.2) talade man om J2SE, J2ME och J2EE, men nu har man gått tillbaka till att bara säga Java SE, Java ME och Java EE (Standard Edition, Micro Edition och Enterprise Edition).

Den senaste just nu heter JDK 6 update 3, eller 1.6.0_03. Finns för Windows, Linux och Solaris (som är Suns egen Unix-variant). Ladda ner gratis från http://java.sun.com/. Innehåll: javac, java, appletviewer mm

Enkel Applet

Filen BoringApplet.java:
import java.awt.*;
import javax.swing.*;

public class BoringApplet extends JApplet {
    public void init() {
	getContentPane().add(new JLabel("Boring Applet!"));
    }  
} // class BoringApplet

Gamla AWT: Applet, Label osv.
Swing: JApplet, JLabel osv.

Språk:

Filen applet.html:

<html>
  <head>
    <title>A web page with a simple applet</title>
  </head>
  <body>
    <applet code="BoringApplet" width="200" height="200">
    </applet>
  </body>
</html>
Appleten i Firefox under Linux:

BoringApplet i Mozilla

Appleten i Internet Explorer under Windows XP:

BoringApplet i Mozilla

Har du en Java-plugin i din webbläsare? I så fall kan du kanske se appleten här, "på riktigt". (Men läs mer nedan ifall det inte skulle funka.)

Ett alternativ till <applet>-taggen

Ovanstående, med <applet>-taggen, förutsätter att alla webbläsartillverkare är snälla, dvs att de överhuvudtaget har en <applet>-tagg, och att den startar en korrekt implementerad Java.

Alternativ: Använd en plugin! Men då krävs mer komplicerad HTML-kod. HtmlConverter, som följer med SDK, kan översätta enkla <applet>-taggar till den nya HTML-koden:

HtmlConverter applet.html
Den nya HTML-koden, filen applet-c.html:
<html>
  <head>
    <title>A web page with a simple applet</title>
  </head>
  <body>
    <!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object
    classid = "clsid:CAFEEFAC-0016-0000-0003-ABCDEFFEDCBA"
    codebase = "http://java.sun.com/update/1.6.0/jinstall-6u30-windows-i586.cab#Version=6,0,30,5"
    WIDTH = "200" HEIGHT = "200" >
    <PARAM NAME = CODE VALUE = "BoringApplet" >
    <param name = "type" value = "application/x-java-applet;jpi-version=1.6.0_03">
    <param name = "scriptable" value = "false">

    <comment>
	<embed
            type = "application/x-java-applet;jpi-version=1.6.0_03" \
            CODE = "BoringApplet" \
            WIDTH = "200" \
            HEIGHT = "200"
	    scriptable = false
	    pluginspage = "http://java.sun.com/products/plugin/index.html#download">
	    <noembed>
            
            </noembed>
	</embed>
    </comment>
</object>

<!--
<APPLET CODE = "BoringApplet" WIDTH = "200" HEIGHT = "200">


</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->

  </body>
</html>
Funkar den koden bättre i din webbläsare? Vi provar här:

På frågan om vad som egentligen är rätt sätt svarar en kollega:

Jag grävde ner mig i det där träsket i somras [läs: 2003]. Det är totalt urflippat! Jag kom fram till att det enda sättet som är portabelt är <applet>. Att trigga installation av rätt plugin-version är bara inte att tänka på, inte ens om man bara begränsar sig till IE och Mozilla.

För den stackare som måste gräva ner sig ännu mer finns mer dokumentation hos Sun.

Slutsats: Man ska inte hoppas för mycket på att det där med Java-appletar funkar av sig självt. Portabiliteten kan det också vara lite si och så med.

Appletvisaren (Applet Viewer)

Vid utveckling slipper man krånglet ovan om man kör i appletvisaren (Applet Viewer).

Annan fördel: Man slipper problem med cachade gamla versioner av appleten i webbläsaren.

appletviewer applet.html
(Inte appletviewer BoringApplet!)

BoringApplet i Applet Viewer under Linux

Ett trick

Appletvisaren bryr sig inte om HTML-koden mer än att just <applet>-taggen ska finnas. Därför kan man stoppa in <applet>-taggen i Java-filen, så slipper man skriva en särskild HTML-fil bara för att testa appleten.

BoringApplet2.java:

// <applet code="BoringApple2t" width="200" height="200">
// </applet>

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

public class BoringApplet2 extends JApplet {
    public void init() {
	getContentPane().add(new JLabel("Boring Applet!"));
    }  
} // class BoringApplet2
Kompilera Java-filen och starta appletvisaren:
javac BoringApplet2.java
appletviewer BoringApplet2.java

Ett trick till

Koden till en Java-applikation är nästan samma som till en Java-applet. Vi kan enkelt göra en applikation av Java-appleten, så kan man köra den direkt!

Lägg bara till en main-metod!

BoringApplet3.java:

// <applet code="BoringApplet3" width="200" height="200">
// </applet>

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

public class BoringApplet3 extends JApplet {
    public void init() {
        getContentPane().add(new JLabel("Boring Applet!"));
    }
    public static void main(String[] args) {
        JApplet applet = new BoringApplet3();
        JFrame frame = new JFrame("BoringApplet3");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(applet);
        frame.setSize(200, 200);
        applet.init();
        applet.start();
        frame.setVisible(true);
    }
} // class BoringApplet3

Läs mer om fönster med Swing

Ett appletexempel: Sqrt

Sqrt.java:
// <applet code="Sqrt" width="300" height="200"></applet>

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

public class Sqrt extends JApplet {
    private JLabel label = new JLabel("Här visas roten");
    private JTextField text = new JTextField("Skriv talet här");
    private JButton button = new JButton("Visa rot!");
    private ButtonListener bl = new ButtonListener();

    public void init() {
        button.addActionListener(bl);
        Container cp = getContentPane();
        cp.setLayout(new FlowLayout());
        cp.add(text);
        cp.add(button);
        cp.add(label);
    }

    // Inre klass för att lyssna på knapp
    class ButtonListener implements ActionListener {

        // Hantera klick på roten-ur-knapp
        public void actionPerformed(ActionEvent event) {
            String numbuf = text.getText();
            try {
                float num = Float.parseFloat(numbuf);
                float res = (float)Math.sqrt(num);
                if (Float.isNaN(res))
                    label.setText("Det måste vara ett positivt tal.");
                else
                    label.setText("Roten ur " + num + " är " + res);
            }
            catch (NumberFormatException exc) {
                label.setText("'" + numbuf + "' är inte ett tal.");
            }
        } // actionPerformed
    } // class ButtonListener
} // class Sqrt
Några bilder på appleten Sqrt. Notera att layout-hanteraren (engelska: layout manager) FlowLayout flyttar om sakerna.
Appleten Sqrt

Appleten Sqrt

Appleten Sqrt

Appleten Sqrt

Appleten på riktigt (om det fungerar i din webbläsare):

Knappar

Buttons.java:
// Adapted from "Button2" in "Thinking in Java", 3d Ed
// <applet code=Buttons width=200 height=75></applet>

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

public class Buttons extends JApplet {
    private JButton
        b1 = new JButton("Bing"),
        b2 = new JButton("Bong");
    private JTextField txt = new JTextField(10);

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String name = ((JButton)e.getSource()).getText();
            txt.setText(name);
        }
    } // class ButtonListener

    private ButtonListener bl = new ButtonListener();
    public void init() {
        b1.addActionListener(bl);
        b2.addActionListener(bl);
        Container cp = getContentPane();
        cp.setLayout(new FlowLayout());
        cp.add(b1);
        cp.add(b2);
        cp.add(txt);
    }
} // class Buttons
Utseende:

Appleten Buttons

Appleten på riktigt (om det fungerar i din webbläsare):

Arvshierarki

java.lang.Object
   java.awt.Component
       java.awt.Container
          java.awt.Panel
              java.applet.Applet
                  javax.swing.JApplet


Thomas Padron-McCarthy (thomas.padron-mccarthy@tech.oru.se), 19 november 2007