Zeichnung auf dem Applet verschwindet

Status
Nicht offen für weitere Antworten.

bristtote

Aktives Mitglied
Hallo :) ,

ich weiss das Thema gibt es sehr oft, dass manchmal eine Zeichnung auf dem Applet verschwindet, wenn ein anders Fenster davor gezogen wird oder wenn es kleiner oder größer gemacht wird. Ich habe gerade das Problem und weiss nicht genau, was ich machen soll. Denn es gibt mehere Ursachen für das Problem. Zum einen heisst es, man hätte die Paint-, repaint- oder update-Methode falsch eingesetzt. Zum anderen heisst es, man solle die Zeichung per BufferedImage und createGraphics speichern und neuladen. Ich weiss jetzt ehrlich gesagt nicht, was das Richtige in meinem Fall ist, deshalb schicke ich Euch den relevanten Teil meines Codes mit. Es wäre nett, wenn mir da jemand weiterhelfen könnte:
Kann es vielleicht sogar an meinem leeren Konstruktor liegen?

Code:
public class itemalsfunk extends Applet implements ActionListener
{

          Graphics stift;
          static boolean zeichne = false;
          MyCanvas zeichenstift;

     public void init ()
     {
         stift = getGraphics();
         zeichenstift = new MyCanvas(stift);
         panel[3].add(zeichenstift);
     }
     public void actionPerformed (ActionEvent e)
     {
         String command = e.getActionCommand();
 
         if(command.equals("Los"))
        {
            Hauptpanel.setVisible(false);
            zeichne=true;
            zeichenstift.paint(stift);

        }
           validate();
           repaint();
     } 
}

class MyCanvas extends Canvas
{

          public MyCanvas(Graphics img)
         {

          }

          public void paint(Graphics g)

          {
                if (itemalsfunk.zeichne==true)
                {

                      g.setColor(Color.lightGray);
                      g.fillRect(150,100,100,20);
                      g.setColor(Color.black);

                      update(g);
                      repaint();
                  }
          }
}
 

thE_29

Top Contributor
Du rufst im paint ein repaint auf?!?!

Nimm das mal raus...

Nimm das update auch raus:


public void update(Graphics g)Calls paint. Doesn't clear the background but see ComponentUI.update, which is called by paintComponent


Da wird alles "zurückgesetzt"
 

bristtote

Aktives Mitglied
thE_29 hat gesagt.:
Du rufst im paint ein repaint auf?!?!

Nimm das mal raus...

Habe ich, leider bringt es nichts.

thE_29 hat gesagt.:
Nimm das update auch raus:


public void update(Graphics g)Calls paint. Doesn't clear the background but see ComponentUI.update, which is called by paintComponent


Da wird alles "zurückgesetzt"

Wenn ich das update rausnehmen, verschwindet die Zeichnung sosfort nach dem start des Applets.
Vielleicht sollte ich die beiden Methoden woanders aufrufen? Was meinst Du?
 

dieta

Top Contributor
Dass nach einer Überdeckung durch ein anderes Fenster nichts gezeichnet wird, liegt daran, dass diese if-Anweisung immer false ist, da sie nur auf die statische variable "zeichne" zugreift:
Code:
if (itemalsfunk.zeichne==true)
{
    g.setColor(Color.lightGray);
    g.fillRect(150,100,100,20);
    g.setColor(Color.black);
    update(g);
    repaint();
}
und so nach repaint() und update() nichts gezeichnet wird.

So müsste es funktionieren:
Code:
public class itemalsfunk extends Applet implements ActionListener
{
    Graphics stift;
    public boolean zeichne = false;
    MyCanvas zeichenstift;

    public void init ()
    {
        stift = getGraphics();
        zeichenstift = new MyCanvas(stift, this);
        panel[3].add(zeichenstift);
    }

    public void actionPerformed (ActionEvent e)
    {
        String command = e.getActionCommand();

        if(command.equals("Los"))
        {
            Hauptpanel.setVisible(false);
            zeichne=true;
            zeichenstift.paint(stift);
        }
        validate();
        repaint();
    }
}

class MyCanvas extends Canvas
{
    itemalsfunk p;

    public MyCanvas(Graphics img, itemalsfunk i)
    {
        p = i;
    }

    public void paint(Graphics g)
    {
        if (p.zeichne==true)
        {
            g.setColor(Color.lightGray);
            g.fillRect(150,100,100,20);
            g.setColor(Color.black);
            repaint();
        }
    }
}
 

thE_29

Top Contributor
Ob es nun statisch oder nicht ist, is egal, weil sie sowieso nachher auf true kommt!

Überschreib mal paintComponents anstatt paint
 

Wildcard

Top Contributor
paint wird nicht direkt aufgerufen. Das ist Aufgabe von AWT/Swing. update und repaint haben inerhalb von paint nichts zu suchen. Ausserdem solltest du super.paint aufrufen.
 

dieta

Top Contributor
Es ist nicht egal, ob static oder nicht.
Er möchte auf die geänderte "zeichne"-Variable der "Besitzerklasse" des MyCanvas-Objekts zugreifen.
Das geht aber nicht, indem er "itemalsfunk.sonstwas" aufruft. um das zu erreichen, muss er dem MyCanvas-Objekt eine Referenz auf "this" übergeben. Dann kann das "MyCanvas"-Objekt über diese Referenz auf die geänderte Variable zugreifen.
 

bristtote

Aktives Mitglied
Ich habe jetzt die if-Anweisung ganz rausgenommen, so sieht demnach mein Code aus:
Es hat sich trotzdem nicht geändert. :) Das Gleiche Problem, wie vorher. Also, lag es leider nicht an der statischen Variable.

Code:
public class itemalsfunk extends Applet implements ActionListener
{

          Graphics stift;
          MyCanvas zeichenstift;

     public void init ()
     {
         stift = getGraphics();
         zeichenstift = new MyCanvas(stift);
         panel[3].add(zeichenstift);
     }
     public void actionPerformed (ActionEvent e)
     {
         String command = e.getActionCommand();

         if(command.equals("Los"))
        {
            Hauptpanel.setVisible(false);
            zeichenstift.paint(stift);

        }
           validate();
           repaint();
     }
}

class MyCanvas extends Canvas
{

          public MyCanvas(Graphics img)
         {

          }

          public void paint(Graphics g)

          {        
                      g.setColor(Color.lightGray);
                      g.fillRect(150,100,100,20);
                      g.setColor(Color.black);

                      update(g);
                      
                            }
}

So, nun zu den Ergebnissen Eurer Vorschläge:
thE_29 hat gesagt.:
Ob es nun statisch oder nicht ist, is egal, weil sie sowieso nachher auf true kommt!

Überschreib mal paintComponents anstatt paint
Die Paint-Methode mit paintComponents zu überschreiben, half leider garnicht.

Wildcard hat gesagt.:
paint wird nicht direkt aufgerufen. Das ist Aufgabe von AWT/Swing. update und repaint haben inerhalb von paint nichts zu suchen. Ausserdem solltest du super.paint aufrufen.
repaint habe ich rausgenommen. Update rauszunehmen, wäre sinnlos, denn ohne sie die Zeichnung innerhalb von paar Sekunken nach dem Start des Applets verschwindet. Kann ich denn update an einer anderen Stelle aufrufen?
Und wo soll ich denn genau super.paint aufrufen? Innerhalb von Paint selbst bringt es ja nichts.



:bahnhof: Oh man, was soll ich bloss machen?
 

thE_29

Top Contributor
Das die boolsche Variable net entscheidend war war sowieso klar...

mach mal

Code:
public void paint(Graphics g)

          {       
super.paint(g);   
                   g.setColor(Color.lightGray);
                      g.fillRect(150,100,100,20);
                      g.setColor(Color.black);

   
                     
                            }
}

Das update gehört einfach net rein!!
 

bristtote

Aktives Mitglied
ne, leute, das hat alles nichts gebracht. Ich bin echt verzweifelt und weiss nicht was ich machen soll!

Ich verstehe nicht, wieseo dieses Problem überhaupt enstanden ist, denn ich habe auch andere Applets mit Zeichnungen und die machen keine Probleme.

Kann es denn an dem leeren Konstruktor liegen?
 

bristtote

Aktives Mitglied
So Leute, leider hat alles nichts gebracht, deshalb habe ich beschlossen den gesamten Code mitzuschicken. Irgendwie habe ich das Gefühl ich habe im Code repaint falsch eingesetzt. Es wäre nett, wenn Ihr euch die Zeit nehmen würdet um den Code durchzustöbern.

Danke

Code:
   import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.util.EventListener.*;

public class itemalsfunk extends Applet implements ActionListener 
{
    
    
    Panel Hauptpanel  = new Panel();
    Color bg_co       = new Color(158,158,158);   
    Button b_b        = new Button("Los");
    Panel panel    [] = new Panel[12];
    String Items   [] = {"NOP", "ADD", "LOAD"}; 
    Choice choices [] = new Choice [11];
    Choice c1      [] = new Choice [11];
    Choice c2      [] = new Choice [11];
    Choice cerg    [] = new Choice [11];
    Label labels   [] = new Label[11];
    Label g_z      [] = new Label[11];
    Label plus     [] = new Label[11];   
    TextField  t      = new TextField(8); 
    Graphics stift; 
    MyCanvas  canvas;
    
public void init ()
{
	for (int i=0; i<panel.length; i++)
	{
    	panel[i]=new Panel();
    	Hauptpanel.add(panel[i]); 
    }
	String s="0";    
	for (int i=0; i<labels.length; i++) 
	{   
    	labels[i] =new Label(s);
    	int s1=Integer.parseInt(s);
    	s1++;
    	s=Integer.toString(s1); 
    	panel[i].add(labels[i]);
    }
    
	String g="=";   
	for (int i=0; i<g_z.length; i++)
	{  
    	g_z[i] =new Label(g);    
    }    
    
	String p="+";   
	for (int i=0; i<plus.length; i++)
	{ 
    	plus[i] =new Label(p);  
    }       
        
	for ( int i = 0; i < choices.length; i++ )
	{
    	choices[i] = new Choice();  
    	panel[i].add(choices[i]);
    }

	for (int i=0; i<choices.length; i++) 
	{  
   		 choices[i].addItem(Items [0]);
   		 choices[i].addItem(Items [1]);  
    	         choices[i].addItem(Items [2]);
        }
    
	for ( int i=0; i<choices.length; i++) 
	{
		 final int index = i;
		 choices[i].addItemListener(new ItemListener()
		 {
    			public void itemStateChanged(ItemEvent e) 
    			{
   
        			if ( ItemEvent.SELECTED == 1)
        			{
      					aendere( index, e.getItem() );
    				}
    			}
  		});
	}



	Hauptpanel.setLayout(new GridLayout(0,1));    
 	setBackground(bg_co);
 	add(Hauptpanel);
 	panel[11].add(b_b);
 	b_b.addActionListener(this);  
 	panel[11].add(t); 
 	stift = getGraphics();
 	canvas = new MyCanvas(stift);
 	panel[3].add(canvas);
}   
        
        
	public void aendere( int index, Object item )
	{
  // wird immer aufgerufen, wenn "choice" ein neues "item" selektiert hat. Das item kann auch null sein!
    	if(item.equals("ADD"))
    	{       
       		 if (cerg[index]!=null)
        	 {
             	  panel[index].remove(cerg[index]);
            	  panel[index].remove(g_z[index]); 
                  panel[index].remove(plus[index]);          
                  panel[index].remove(c1[index]);
                  panel[index].remove(c2[index]);        
             } 
 
      	   c1[index]  = new Choice();
       	   c2[index]  = new Choice();
       	   cerg[index]= new Choice();
       	   g_z[index] = new Label("=");
       	   plus[index]= new Label("+");
       	 
	       c1[index].add("R 0");
	       c1[index].add("R 1");

	       c2[index].add("R 0");
	       c2[index].add("R 1");

	       
	       cerg[index].add("R 1");
	       cerg[index].add("R 2");

	       
	       
	       panel[index].add(cerg[index]);
	       panel[index].add(g_z[index]);     
	       panel[index].add(c1[index]);
	       panel[index].add(plus[index]);
	       panel[index].add(c2[index]);    
   	   }
      
       else if(item.equals("LOAD"))
       {
            
       		if (cerg[index]!=null) 
       		{ 
         	     panel[index].remove(cerg[index]); 
        	     panel[index].remove(c1[index]);
                     panel[index].remove(c2[index]);        
                     panel[index].remove(g_z[index]);
                     panel[index].remove(plus[index]);
            }
        
       	  c1[index]  = new Choice();
          c2[index]  = new Choice();
          cerg[index]= new Choice();
          g_z [index]= new Label("=");
          plus [index]= new Label("+");
        
          c1[index].add("R 0");
          c1[index].add("R 1");

       
          c2[index].add("0");
          c2[index].add("1");

       
       
          cerg[index].add("R 1");
          cerg[index].add("R 2");


        
          panel[index].add(cerg[index]); 
          panel[index].add(g_z[index]);
          panel[index].add(c1[index]);
          panel[index].add(plus[index]);
          panel[index].add(c2[index]); 
          
        
       }
          
       else if(item.equals("NOP"))
       {
          	
          panel[index].remove(cerg[index]);
          panel[index].remove(g_z[index]);
          panel[index].remove(plus[index]);          
          panel[index].remove(c1[index]);
          panel[index].remove(c2[index]); 
       }
          
       repaint();
       validate(); 
}
 
   public void actionPerformed (ActionEvent e){
   	
  
    String command = e.getActionCommand();  
   
        if(command.equals("Los"))
    {
  
        Hauptpanel.setVisible(false);
        canvas.paint(stift);
            
    }   
    canvas.validate();  
    canvas.repaint();  

    }
	    
  
}
   
   
class MyCanvas extends Canvas 
{

	public MyCanvas(Graphics img)
	{	
    super();	
	}
		
	public void paint(Graphics g)
	
	{	
	
			g.setColor(Color.lightGray);
			g.fillRect(150,100,100,20); 
			g.setColor(Color.black);	 
					

			update(g);
	}
	
	
			
}
 

bristtote

Aktives Mitglied
Ja, das ist auch richtig.
Aber wenn Du jetzt auf den Button drückst, kommt eine Zeichnung, ein Rechteck. Wird dieser durch ein anderes Fenster verdeckt, ist es dann weg und kommt nicht mehr wieder. :( und das ist das eigentliche Problem.

Achja, sehr wichtig, mir ist aufgefallen, dass das Problem nur dann auftritt, wenn ich eine innerer Klasse habe, also "Mycanvas". Überschreibe ich Paint in der Hauptklasse funktioniert alles einwandfrei. Setze ich vielleicht Canvas falsch ein?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Zeichnung in Container Java Basics - Anfänger-Themen 8
J Java Array Zeichnung Skalieren und verschieben Java Basics - Anfänger-Themen 5
E Java Canvas Zeichnung Java Basics - Anfänger-Themen 2
S Über Button Zeichnung ändern Java Basics - Anfänger-Themen 5
J OOP GUI mit JTable und Zeichnung Java Basics - Anfänger-Themen 3
S Zeichnung der GUI kontrollieren Java Basics - Anfänger-Themen 9
R Zeichnung entfernen und neue Zeichnen lassen Java Basics - Anfänger-Themen 20
F Zeichnung verschwindet hinter Bild Java Basics - Anfänger-Themen 2
D Programm für Widestandsberechnung mit Zeichnung Java Basics - Anfänger-Themen 25
L zeichnung verschwindet nach komponenteneinfügung Java Basics - Anfänger-Themen 20
S Zeichnung drehen Java Basics - Anfänger-Themen 13
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
M Java-Applet zur Mittelwertberechnung Java Basics - Anfänger-Themen 3
D Java Applet wird nicht im Browser angezeigt Java Basics - Anfänger-Themen 6
M bestehendes Projekt als Applet speichern Java Basics - Anfänger-Themen 2
S Erste Schritte Java - Applet - Rechteck ständig versetzen Java Basics - Anfänger-Themen 14
A Applet Plot für atan erstellen Java Basics - Anfänger-Themen 1
S Erste Schritte Java Applet lässt sich im Browser nicht öffnen Java Basics - Anfänger-Themen 9
K JDK installieren displays java applet für MAC Java Basics - Anfänger-Themen 10
S Zeichen von abgerundeten Rechtecken auf einem Applet Java Basics - Anfänger-Themen 5
J Einfache einbindung eines Bildes in ein Applet Java Basics - Anfänger-Themen 4
S Klassen Applet extern aufrufen Java Basics - Anfänger-Themen 1
J Erstes Applet läßt sich nicht anzeigen Java Basics - Anfänger-Themen 2
C Applet Probleme Java Basics - Anfänger-Themen 1
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
G Applet in ein JSP einbinden Java Basics - Anfänger-Themen 1
C Java-Applet Fehler "NoClassDefFoundError"? Java Basics - Anfänger-Themen 1
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
J JavaScript findet Applet Methode nicht Java Basics - Anfänger-Themen 2
J Punkte im Java-Applet verbinden Java Basics - Anfänger-Themen 4
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0
K Applet funz. im Browser nicht Java Basics - Anfänger-Themen 11
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
thet1983 Erste Schritte <param> Tag in Applet Java Basics - Anfänger-Themen 4
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
G Signiertes Applet wird nicht ausgeführt Java Basics - Anfänger-Themen 1
Y Applet: Verschlüsselung Java Basics - Anfänger-Themen 3
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
F signiertes Applet fkt. nicht bei lokalem Aufruf Java Basics - Anfänger-Themen 2
K Frage zu Applet Java Basics - Anfänger-Themen 3
V While Schleife für ganzes Applet Java Basics - Anfänger-Themen 6
P Applet Histogramm Java Basics - Anfänger-Themen 6
H 27 Kreise Zeichnen Java Applet Java Basics - Anfänger-Themen 2
G Java Applet aus Eclipse heraus testen? Java Basics - Anfänger-Themen 6
S Applet findet Klasse nicht Java Basics - Anfänger-Themen 7
R Java Applet mit Mausklick ansprechen Java Basics - Anfänger-Themen 3
C Java Applet in html. Pong - old school Spiel Java Basics - Anfänger-Themen 10
S Applet-Objekt ist vor dem Hintergrund Java Basics - Anfänger-Themen 11
F Problem mit Applet Java Basics - Anfänger-Themen 5
A Applet mit Object-Tags einbinden. Java Basics - Anfänger-Themen 3
S Erste Schritte Fenster wechsel im Applet Java Basics - Anfänger-Themen 7
S Applet Deployment Java Basics - Anfänger-Themen 2
X Applet Fehler: java.lang.reflect.InvocationTargetException Java Basics - Anfänger-Themen 45
H Applet - main()-Methode Java Basics - Anfänger-Themen 4
K Applet wird nicht im Browser und Appletviewer angezeigt Java Basics - Anfänger-Themen 5
L Applet : keine Recht für Zugriff auf Clipboard (trotz Zertifikat) Java Basics - Anfänger-Themen 4
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
H Klassen in Eclipse stellt es im Ausgabe-Applet nicht dar Java Basics - Anfänger-Themen 5
L Applet soll Html-File öffnen Java Basics - Anfänger-Themen 2
L NetBeans Applet in html Java Basics - Anfänger-Themen 4
Dogge Start:Applet nicht Initialisiert Java Basics - Anfänger-Themen 11
D Applet beenden Java Basics - Anfänger-Themen 7
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
M RSA Applet ohne Cipher Java Basics - Anfänger-Themen 15
B String verschlüsseln - Applet - ohne BASE64 Java Basics - Anfänger-Themen 7
S Methode in Applet starten Java Basics - Anfänger-Themen 2
M AWT Applet - Button aus anderer Klasse abfragen Java Basics - Anfänger-Themen 4
W Probleme mit Java Applet Java Basics - Anfänger-Themen 5
M Applet kann in Browser nicht ausgeführt werden Java Basics - Anfänger-Themen 4
L Applet: Laden unterbricht den Browserfokus (scrollen) Java Basics - Anfänger-Themen 2
Z Applet startet nicht bei Domain mit Umlaut Java Basics - Anfänger-Themen 2
B Externe Libraries fuer Applet ... Pfad eingeben? Java Basics - Anfänger-Themen 23
Helgon ClassNotFound Applet Java Basics - Anfänger-Themen 6
U Applet Signiert und trotzdem Fehlermeldung Java Basics - Anfänger-Themen 18
E Schach in Java-Applet <No main classes found> Java Basics - Anfänger-Themen 5
S Applet Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
E Applet wird nicht angezeigt Java Basics - Anfänger-Themen 11
P Problem- Java Applet wird nicht ausgeführt Java Basics - Anfänger-Themen 9
B Applet - Laden eines Java-Fensters bricht ab Java Basics - Anfänger-Themen 6
N Import Problem, Applet will nicht Java Basics - Anfänger-Themen 6
M Applet Eclipse Vollbild Java Basics - Anfänger-Themen 3
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
I Java Applet Java Basics - Anfänger-Themen 8
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
L Referenced Libraries korrekt in Java Applet einbinden.. Java Basics - Anfänger-Themen 2
KBJ Java Applet Gästebuch Java Basics - Anfänger-Themen 12
T Java Applet braucht mehrere Minuten zu Start Java Basics - Anfänger-Themen 5
U Applet wird nicht angezeigt Java Basics - Anfänger-Themen 2
J J-Applet, Frage Java Basics - Anfänger-Themen 19
J Applet farblich gestalten Java Basics - Anfänger-Themen 5
M Applet lokaler Festplattenzugriff Java Basics - Anfänger-Themen 25
X Applet - Client/Server Java Basics - Anfänger-Themen 2
M Applet ist nur graues Feld Java Basics - Anfänger-Themen 12
O webserver für Applet und php Java Basics - Anfänger-Themen 7
J Fehlermeldung: Applet nicht initialisiert Java Basics - Anfänger-Themen 24

Ähnliche Java Themen

Neue Themen


Oben