# Java Fehler, weiß aber nicht wie er behoben wird. :'(



## blu3light (28. Mai 2006)

Ich habe diesmal eine Java, bzw Java Applet Problem und weiß nicht wie ich diesen Fehler beheben kann.
Mein Code:

```
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.*;
 
public class TestApplet extends Applet
{
   TextField  text;
   Button     send;
   String     tmsg;
 
   class Painter implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         e.getActionCommand();
 
         tmsg.setText(text.getText());
         paint(tmsg);
      }
 
      public void init()
      {
         text   = new TextField(5);
         send   = new Button("Send");
 
         setLayout(new FlowLayout(FlowLayout.LEFT));
 
         add(text);
         add(send);
 
         send.addActionListener(new Painter());
      }
   }
 
   public void paint(Graphics gc)
   {
      gc.drawString(gc);
   }
}
```


Und diese Meldung kommt beim compilieren:




Was habe ich falsch gemacht? bzw. Wie kann man es ausbessern?


----------



## André Uhres (28. Mai 2006)

```
//package applets;
/*
 * TestApplet.java
 */
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.*;
public class TestApplet extends Applet {
    private TextField  text;
    private Button     send;
    private Label      tmsg;
    public void init() {
        text   = new TextField(5);
        send   = new Button("Send");
        tmsg   = new Label();
        tmsg.setPreferredSize(new Dimension(200,20));
        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(text);
        add(send);
        add(tmsg);
        send.addActionListener(new Painter());
    }
    class Painter implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            e.getActionCommand();
            tmsg.setText(text.getText());
        }
    }
}
```


----------



## blu3light (28. Mai 2006)

Hmm... Nur wann, bzw wie wird das dann "gepaintet"? Es muss ja auch auf dem Applet angezeigt werden. Macht das setText() schon? :?:


----------



## blu3light (28. Mai 2006)

Als ich deinen Code compiliert habe, hat sich die Datei _TestApplet.class_ erstellt. Es hat sich aber auch eine Datei namens _TestApplet$Painter.class_ erstellt!

Was nun? Wieso ist das passiert?

Tut mir leid wegen so dummen fragen, lese aber erst seid ca. 1 Woche ein Buch über Java - der Name des Buches ist: Java-easy, falls es jemanden interresiert!  :roll:  :lol:


*ups* tut mir leid, hatte nicht den "edit" Button benutzt.  :roll:

Habe die _TestApplet$Painter.class_ Datei mal weggelassen und schon konnte das Applet nicht geladen werden. Nur wieso hat sich diese Datei hergestellt?! Wieso passiert das?  :?  :?

Habe angefangen das komplette Tutorial von Sun.com zu lesen. Es ist zwar englisch, aber ich kann ja englisch. Naja. Das java-easy Buch hat manches nicht so gut erklärt. Ich wollte mir erst noch ein weiteres Buch davon holen, was ich aber nun vielleicht nicht mache, da das Tutorial von Sun ziemlich gut erklärt.
Nunja; ich glaube das diese TestApplet$Painter.class Datei sich wegen der new Methode erstellt hat. Stimmt das so?


----------



## Tissi (28. Mai 2006)

Also: Die zusätzliche .class-Datei kommt durch die inner class "Painter" (zeile 24). Sie steht zwar innerhalb der anderen Klasse, bekommt aer trotzdem eine eigene .class-Datei.

Der erste Fehler: Es gibt in der Klasse java.lang.String keine Methode setText(String s). 
Wenn du also tmsg.setText() aufrufst, kann diese Methode schlicht und einfach gar nicht gefunden werden, weil sie nicht existiert. Stattdessen schreibst du einfach

```
tmsg = text.getText();
```
um den String zu initialisieren.

Der zweite Fehler: Du versuchst die Methode paint() mit einem String als Parameter aufzurufen. Eine solche Methode gibt es aber gar nicht. Die Methode paint in deiner Klasse verlangt als Parameter ein Objekt der Klasse Graphics. Du müsstest also eine Methode paint(String s) erstmal schreiben.


```
public void paint(String s)
{
//code
}
```

Der dritte Fehler: Du versuchst die Methode drawString() mit dem Graphics-Objekt als Parameter aufzurufen. Diese Methode gibt es aber gar nicht, der Parameter muss ein String sein:


```
public void paint(String s)
{
getGraphics().drawString(s);
}
```

Das würde zumindest den String schreiben, ich bin allerdings nicht ganz sicher, wohin. Du musst unter Umständen dem Graphics irgendwie die Position mitteilen, wo der String hin soll.


----------



## blu3light (28. Mai 2006)

Java-easy Buch hat gesagt.:
			
		

> *Die Applet-Methoden*
> 
> Auch wenn es vielleicht gar nicht so aussieht, aber unsere Klasse HalloWWW enthält jetzt - dank der Ableitung von der Klasse Applet - tatsächlich bereits fünf Methoden namens paint() .....




Weiter unten steht dann:


> paint() wird aufgerufen, wenn der Browser möchte, dass sich das Applet selbst zeichnet




Habe ich da etwas falsch verstanden oder was?  ???:L

Und wie wird aus diesem Text (bzw code) der Text wiedergegeben?

```
//package applets;
/*
* TestApplet.java
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.*;
public class TestApplet extends Applet {
    private TextField  text;
    private Button     send;
    private Label      tmsg;
    public void init() {
        text   = new TextField(5);
        send   = new Button("Send");
        tmsg   = new Label();
        tmsg.setPreferredSize(new Dimension(200,20));
        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(text);
        add(send);
        add(tmsg);
        send.addActionListener(new Painter());
    }
    class Painter implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            e.getActionCommand();
            tmsg.setText(text.getText());
        }
    }
}
```

Ich habe die Datei auch mal compiliert und hochgeladen! Klick mich oder lass es sein!


----------



## Illuvatar (28. Mai 2006)

In der paint Methode steht schon was drin, auch wenn du sie nicht überschreibst. Da zeichnet sich auch der Button und das Textfeld. Du sagst dem Label, dass das ab jetzt den und den Text hat, dann sagt das automatisch dem Applet, dass es sich neu zeichnen soll, und wenn es sich dann neu zeichnet, schreibt das Label den neuen Text hin.


----------



## blu3light (28. Mai 2006)

Illuvatar hat gesagt.:
			
		

> In der paint Methode steht schon was drin, auch wenn du sie nicht überschreibst. Da zeichnet sich auch der Button und das Textfeld. Du sagst dem Label, dass das ab jetzt den und den Text hat, dann sagt das automatisch dem Applet, dass es sich neu zeichnen soll, und wenn es sich dann neu zeichnet, schreibt das Label den neuen Text hin.



Achso. Also führt sich das "paint()" sozusagen selbst aus und zeichnet die Teile ganze einfach?
Hoffe ich hab das nun richtig verstanden.

Nur wieso hat André Uhres denn das mit reingeschrieben? Ist das die größe des Labels oder was?

```
tmsg.setPreferredSize(new Dimension(200,20));
```


----------



## Leroy42 (29. Mai 2006)

blu3light hat gesagt.:
			
		

> Ist das die größe des Labels oder was?
> 
> ```
> tmsg.setPreferredSize(new Dimension(200,20));
> ```



Wie der Methodenname schon sagt: Die Zeile weist das Label an,
bei Nachfrage (z.B. durch den LayoutManager), eine _bevorzugte_
Größe von 200x20 Pixeln anzugeben.

Normalerweise muß das aber nicht sein; dann berechnet Label eben
selbst wie groß es sein möchte/sollte.

Wenn du dein Programm z.B. variabel halten willst und es einen
Button "binHeutBesoffen" gibt, der allen Labels eine neue 
Schriftgrößte verpaßt


```
label.setFont(label.getFont().deriveFont(48.0f));
```

dann würde dieses festverdrahtete new Dimension(200, 20) ziemlich
sinnlos


----------



## André Uhres (31. Mai 2006)

..hast du das propiert oder wirfst du jetzt AWT & Swing an ee Kachdëppen..


----------



## Leroy42 (1. Jun 2006)

(noch) nicht direkt.

Aber es kommt schon mal vor, daß ich die Auflösung auf 800x600 Pixel²
vermindern muß, um _arbeiten_ zu können.


----------

