# JApplet & MouseListener



## Dominicana (17. Mai 2006)

Habe folgendes Problem mit einem Applet :

Das Applet: siehe hier (Das obere funktioniert, es geht um das linke.)
Beim ersten Aufrufen klappt alles. ABER beim 2. mal gibt es in der Java-Konsole folgende Exception :



> Exception in thread "AWT-EventQueue-11" java.lang.NullPointerException
> at hp.Menue.paintPolygon(Menue.java:81)
> at hp.ButtonMouseListener.mouseEntered(Menue.java:143)
> at java.awt.AWTEventMulticaster.mouseEntered(Unknown Source)
> ...



Kann es sein, daß der MouseListener daran schuld ist??? Mit einem ActionListener scheint es zu funktionieren.


```
package hp;

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

public class Menue extends JApplet {
    boolean isStandalone = false;
    BorderLayout borderLayout1 = new BorderLayout();
    static JButton home = new JButton("Startseite");
    static JButton version = new JButton("Version");
    static JButton impressum = new JButton("Impressum");
    static JButton link = new JButton("Link´s");
    static JButton programm = new JButton("Download´s");
    static JButton gaestebuch = new JButton("Gästebuch");
    Graphics g;
    JPanel pane;
    String url = null;
    
    public String getParameter(String key, String def) {
        return isStandalone ? System.getProperty(key, def) :
                (getParameter(key) != null ? getParameter(key) : def);
    }

    public Menue() {
    }

    public void init() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        super.init();
        home.reshape(40, 10, 120, 30);
        home.setName("home");
        home.addMouseListener(new ButtonMouseListener(home, pane, this));
        programm.reshape(40, 50, 120, 30);
        programm.setName("programm");
        programm.addMouseListener(new ButtonMouseListener(programm, pane, this));
        version.reshape(40, 90, 120, 30);
        version.setName("version");
        version.addMouseListener(new ButtonMouseListener(version, pane, this));
        link.reshape(40, 130, 120, 30);
        link.setName("link");
        link.addMouseListener(new ButtonMouseListener(link, pane, this));
        gaestebuch.reshape(40, 170, 120, 30);
        gaestebuch.setName("gaestebuch");
        gaestebuch.addMouseListener(new ButtonMouseListener(gaestebuch, pane, this));
        impressum.reshape(40, 210, 120, 30);
        impressum.setName("impressum");
        impressum.addMouseListener(new ButtonMouseListener(impressum, pane, this));
        pane = new JPanel();
        pane.setLayout(null);
        pane.add(home);
        pane.add(programm);
        pane.add(version);
        pane.add(link);
        pane.add(gaestebuch);
        pane.add(impressum);
        pane.repaint();
        pane.validate();
        setContentPane(pane);
    }
    public void paintPolygon(Graphics g, String name) {
        Graphics2D g2D = (Graphics2D) g;
        int h = 0;
        if (name == "home") { h = 0; }
        if (name == "programm") { h = 40; }
        if (name == "version") { h = 80; }
        if (name == "link") { h = 120; }
        if (name == "gaestebuch") { h = 160; }
        if (name == "impressum") { h = 200; }
        int[] i = {10, 30, 10};
        int[] j = {10+h, 25+h, 40+h};
        int k = 3;
        g2D.setColor(new Color(255, 255, 255));
        g2D.fillRect(0, 0, 40, 500);
        GradientPaint gradientPaint = new GradientPaint(0, 10+h,
                Color.blue,
                0, 25+h,
                Color.yellow,
                true);
        g2D.setPaint(gradientPaint);

        g2D.fillPolygon(i, j, k);
    }
    public void paintComponent(Graphics g) {
    }
    public void start() {
    }
    public void stop() {
    }
    public void destroy() {
    }
    public String getAppletInfo() {
        return "Applet Information";
    }
    public String[][] getParameterInfo() {
        return null;
    }
}
class ButtonMouseListener implements  MouseListener {
    JButton button;
    JPanel pane;
    Menue adaptee;
    String url = "";
    ButtonMouseListener(JButton button, JPanel pane, Menue adaptee) {
        this.button = button;
        this.pane = pane;
        this.adaptee = adaptee;
    }
    public void mouseClicked(MouseEvent e) {
    }
    public void mouseEntered(MouseEvent e) {
        adaptee.paintPolygon(adaptee.getGraphics(), button.getName());
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
        if (button.getName() == "home")      { url = "http://dvddatabase.zweipage.de/text_58476398_07594370_69255194_deutsch.html"; }
        if (button.getName() == "programm")  { url = "http://dvddatabase.zweipage.de/text_58476398_1393814_69255194_deutsch.html"; }
        if (button.getName() == "version")   { url = "http://dvddatabase.zweipage.de/text_58476398_98333865_69255194_deutsch.html"; }
        if (button.getName() == "link")      { url = "http://dvddatabase.zweipage.de/text_58476398_3181852_69255194_deutsch.html"; }
        if (button.getName() == "impressum") { url = "http://dvddatabase.zweipage.de/text_58476398_32768152_69255194_deutsch.html"; }
        if (button.getName() == "gaestebuch"){ url = "http://dvddatabase.zweipage.de/ext_58476398_guestbook_49925691_deutsch.html"; }
        try {
            adaptee.getAppletContext().showDocument(new URL(url), "frame3");
        } catch(MalformedURLException urlE) {
            System.out.println(urlE.getMessage());
        }
    }
    public void mouseReleased(MouseEvent e) {
    }
    public void paintPolygon(Graphics g, String name) {
        Graphics2D g2D = (Graphics2D) g;
        int h = 0;
        if (name == "home") {
            h = 0;
        }
        if (name == "programm") {
            h = 40;
        }
        if (name == "version") {
            h = 80;
        }
        if (name == "link") {
            h = 120;
        }
        if (name == "gaestebuch") {
            h = 160;
        }
        if (name == "impressum") {
            h = 200;
        }
        int[] i = {10, 30, 10};
        int[] j = {10 + h, 25 + h, 40 + h};
        int k = 3;
        g2D.setColor(new Color(255, 255, 255));
        g2D.fillRect(0, 0, 40, 500);
        GradientPaint gradientPaint = new GradientPaint(0, 10 + h,
                Color.blue,
                0, 25 + h,
                Color.yellow,
                true);
        g2D.setPaint(gradientPaint);

        g2D.fillPolygon(i, j, k);
    }
}
```

Die Methode "paintPolygon" ist nur zum Testen in beiden Klassen.

Wenn jemand einen Grund weiß, würde ich mich freuen, wenn er was dazu schreibt!

Dom.

EDIT: Möglicherweise hab ich eine Lösung : habe die paintPolygon mal mit einer "try {} catch (Exception e) {}" versehen und siehe da - ES GEHT! (Bist auf die anderen Exceptions)


----------



## Dominicana (17. Mai 2006)

Auch wenn *L-ectron-X* der Meinung it, daß sei schlechter Programmierstil, habe ich alle MouseEvents mit jeweils einer try catch Klammer umgeben und es funktioniert. Siehe Link 0ben.

Dom.


----------



## L-ectron-X (17. Mai 2006)

Ich bin deshalb nicht begeistert, weil in sauberem Code ungewollt keine NullPointerException geworfen wird.
Und ganz besonders in diesem Fall. Klar kannst du die Exception auffangen und damit den Fehler "beheben". Aber du umgehst damit eigentlich nur das Problem, statt es zu beheben.

Nebenbei: reshape() ist deprecated.
Der super-Aufruf von Methoden des Applets-Lebenszyklusses sind unnötig, da sie in der Klasse Applet leer implementiert wurden. Du rufst damit Methoden auf, die nichts machen.
Und: Für Mausklicks auf Button ist die Verarbeitung von ActionEvents vorgesehen.


----------



## Dominicana (17. Mai 2006)

L-ectron-X hat gesagt.:
			
		

> Nebenbei: reshape() ist deprecated.


Beim JBuilder werden keinerlei Fehler angezeigt. Und wenn, was wäre die Alternative??? ???:L Die Buttons müssen nunmal genau an der xy-Koordinate liegen.


			
				L-ectron-X hat gesagt.:
			
		

> Und: Für Mausklicks auf Button ist die Verarbeitung von ActionEvents vorgesehen.


 Soll ich etwa noch einen ActionListener einbauen, wo ich den MausListener trotzallem benötige? Dadurch würde der Code doch nur umfangreicher (ist jetzt schon als .jar 49,6kb groß und ich habe nur 50,0kb Platz auf der HP!).  :shock: 

Aber die überflüssigen Methoden werd ich löschen :wink:


----------



## L-ectron-X (17. Mai 2006)

Als Ersatz kannst du entweder mit einem LayoutManager arbeiten oder die setBounds()-Methode benutzen.

50kB für 'ne Hompage?
Warum wechselst du nicht mal den Provider? (Arcor 25MB, Freenet 60MB etc.)


----------



## Dominicana (17. Mai 2006)

Bei dem Anbieter kann man sich "hocharbeiten", soll heißen, je mehr Leute die Seite besuchen, desto mehr Speicher bekommt man (habe z.Z. nur 200kb, und die sind zu 99,98% belegt). Andere Anbieter haben zwar mehr Speicher, stellen diesen aber nicht zum Download bereit - wenn ich meine Programme dort zum Download anbiete, wird evtl. die Seite gesperrt. Eine eigene Domain wäre eine Alternative, ist aber auf dauer zu Teuer (bräuchte eigentlich mehrere GB an Speicher). Wie ich soeine Seite mit Werbung sponsoren kann, hab ich noch nicht rausbekommen (wer was dazu weiß , kann mir ja schreiben (PN)).


----------

