Grafik von main aus aufrufen

chrysi

Mitglied
Zu dem folgenden Code hätte ich eine Frage: Wie kann ich von main aus das Bild aufrufen? So wie der Code unten steht funktioniert es leider nicht. HELP, please!
---------------------------------------------------------------------
Java:
import java.awt.*;
import javax.swing.*;

public class Graphikdemo extends JApplet
{
   Image bild;

   
   public void init()
   {
      bild = getImage(getDocumentBase(),
             "bilder/desktop.jpg");
   }

 public void paint(Graphics g)
   {
      lesen("test.txt");
       
       g.drawString("Anzeigen von Bildern", 20, 20);
      for(int i = 0; i <= 20; i++)
       for(int j = 0; j <= 20; j++)
      g.drawImage(bild,i*30,j*30,30,30,this);
    }

  public static void main() throws IOException
  {

Graphikdemo hallo = new Graphikdemo();
hallo.paint();


  }
}
 
Danke für die schnelle Antwort.

Ich brauche dass, weil das Programm mehrere Funktionen haben soll: Grafik anzeigen und Datei lesen. Deshalb steht im Code auch die Zeile

lese("test.txt");

Die Zeile kann man ruhig erstmal streichen.

Aber wie kann man das Bild von main aus aufrufen? Geht das oder nicht? Für Antworten wäre ich dankbar.
 
Ein Applet hat keine main-Methode.
Was für eine Anwendung die main-Methode ist, ist für ein Applet die init()-Methode.
In der paint-Methode sollte auch sonst kein weiterer Code reingepackt werden. Da hat das lese(...) nix verloren. In der paint-Methode wird gezeichnet, mehr nicht.

Hab's Dir mal hingebogen.

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

public class Graphikdemo extends JApplet {

	private static final long	serialVersionUID	= 1L;
	Image	bild;

	public void init() {
    //Bild laden- bei diesem Beispiel liegt das Bild im gleichen Verzeichnis
		//wie die class-Datei
    bild = getImage(getCodeBase(),"./air.jpg"); 
    
    //Bild mit MediaTracker laden und erst weite machen, wenn zuverlässig geladen
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(bild, 0);
    
    try {
       mt.waitForAll();
    } catch (InterruptedException e) {}
    
	}

	//in der paint-Methode nur zeichnen, sonst nix
	public void paint(Graphics g) {
		super.paint(g); //super-Aufruf nciht vergesssen.

		g.drawString("Anzeigen von Bildern", 20, 20);
    g.drawImage(bild, 0, 0, this); 
	}


}
 
Danke. Ich hätte noch 2 Fragen:

1. Kann man in der init auch die Parameter übergeben, wie das Bild angezeigt werden soll? D.h. mit x- und y- Koordinate und Höhe und Breite.

2. Mein Programm funktioniert nicht mit dem Lesen der Datei. Was ist da falsch? Hier ist mal der Code:

Java:
import java.awt.*;
import javax.swing.*;
import java.io.*;

public class Graphikdemo extends JApplet {
 
    private static final long   serialVersionUID    = 1L;
    Image   bild;
 
    public void init() {
    
    lesen("test.txt");
        
    bild = getImage(getCodeBase(),"./desktop.jpg");
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(bild, 0);
    
    try {
       mt.waitForAll();
    } catch (InterruptedException e) {}
    
    }
    
    public void paint(Graphics g) {
        
       super.paint(g);
       
       g.drawImage(bild, 10, 10, this); 
    }
      
    public static void lesen(String name) throws IOException{
    FileReader fr = new FileReader("test.txt");
    BufferedReader br = new BufferedReader(fr);
    int anzahl;

    String zeile = "";

    while( (zeile = br.readLine()) != null )
    {
    anzahl = zeile.length();
    System.out.print(zeile);
    System.out.print("\n");
    }
    br.close();
}
     
}
 
Richtiges Einrücken würde das Lesen sehr erleichtern. Wenn man sich die Mühe schon für sich selbst nicht geben mag, sollte man es wenigstens tun, wenn man Hilfe sucht.

Ich versteh es nicht, warum sich da so viele schwer tun. In Eclipse zum Beispiel kann man genau einstellen, wie man den Text formatiert haben will und ihn dann auf Knopfdruck einrücken lassen.
 
Richtiges Einrücken würde das Lesen sehr erleichtern. Wenn man sich die Mühe schon für sich selbst nicht geben mag, sollte man es wenigstens tun, wenn man Hilfe sucht.

Ich versteh es nicht, warum sich da so viele schwer tun. In Eclipse zum Beispiel kann man genau einstellen, wie man den Text formatiert haben will und ihn dann auf Knopfdruck einrücken lassen.

Hauptsache wieder ein Punkt mehr für die Postinganzahl, gell? :autsch:


@chrysi:

Zu Deinen Fragen:
1. Nein, geht nicht. Das kannst Du für Standardklassen mit einem Blick in die API auch selbst rausfinden. init() ist dort parameterlos definiert. Man kann über die HTML-Seite in der das Applet eingebunden wird eine gewisse Größe festlegen oder in der init-Methode mit den vorhanden Methoden wie z. B. setSize() arbeiten.

2. "funktioniert nicht" ist ein bißchen dünn.... Du würdest doch auch niemals ein Auto in die Werkstatt bringen und sagen "fährt nicht", oder? :noe:
Du solltest eine Fehlermeldung posten oder zumindest das falsche Verhalten beschreiben.
Folgender Code hat bei mir funktioniert - vorausgesetzt, die Textdatei befindet sich bei den Class-Dateien im Verzeichnis.

Java:
import java.awt.*;
import javax.swing.*;
import java.io.*;
 
public class Graphikdemo extends JApplet {
 
    private static final long   serialVersionUID    = 1L;
    Image   bild;
 
    public void init() {
    
    try {
			lesen("test.txt");
		} catch (IOException e1) {
			e1.printStackTrace();
		}
        
    bild = getImage(getCodeBase(),"./desktop.jpg");
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(bild, 0);
    
    try {
       mt.waitForAll();
    } catch (InterruptedException e) {}
    
    }
    
    public void paint(Graphics g) {
        
       super.paint(g);
       
       g.drawImage(bild, 10, 10, this); 
    }
      
    public static void lesen(String name) throws IOException{

    	
   	FileReader fr = new FileReader("test.txt");
    BufferedReader br = new BufferedReader(fr);
    int anzahl;
 
    String zeile = "";
 
    while( (zeile = br.readLine()) != null )
    {
    anzahl = zeile.length();
    System.out.print(zeile);
    System.out.print("\n");
    }
    br.close();
}
     
}
 
Hallo,

2. "funktioniert nicht" ist ein bißchen dünn.... Du würdest doch auch niemals ein Auto in die Werkstatt bringen und sagen "fährt nicht", oder? :noe:
Du solltest eine Fehlermeldung posten oder zumindest das falsche Verhalten beschreiben.
Folgender Code hat bei mir funktioniert - vorausgesetzt, die Textdatei befindet sich bei den Class-Dateien im Verzeichnis.
Das Problem waren die IOExceptions. Aber ich habe das jetzt hingekriegt.

Aber es gibt wieder ein neues Problem🙁

Und zwar beim folgenden Code. Ich möchte gerne zwei Bilder an verschiedenen Positionen anzeigen lassen. Aber irgendwie erscheint immer nur 1 Bild. Ich glaube das erste Bild wird überschrieben. Wie kann ich beide Bilder gleichzeitig anzeigen lassen? Danke im Voraus.

Java:
import java.awt.*;
import javax.swing.*;
import java.io.*;

public class Graphikdemo extends JApplet {
 
    private static final long   serialVersionUID    = 1L;
    Image   bild;
 
    int x = 20;

    public void init() {
    

    bild = getImage(getCodeBase(),"./desktop2.jpg");

    MediaTracker mt = new MediaTracker(this);
    mt.addImage(bild, 0); 
    try {
       mt.waitForAll();
    } catch (InterruptedException e) {}

    x = x + 100;

    MediaTracker mt2 = new MediaTracker(this);
    mt2.addImage(bild, 0); 
    try {
       mt2.waitForAll();
    } catch (InterruptedException e) {}
}
    
    
    public void paint(Graphics g) { 
       super.paint(g);
       g.drawImage(bild, x, 20, 50, 50, this); 
    }
      
}
 
Ich möchte gerne zwei Bilder an verschiedenen Positionen anzeigen lassen. Aber irgendwie erscheint immer nur 1 Bild. Ich glaube das erste Bild wird überschrieben.
In dem Code ist nichts von einem zweiten Bild zu sehen. Weder wird ein zweites Bild geladen noch gezeichnet.

Denke hier mangelt es an den Grundlagen der Programmierung und das Problem ist eventuell noch zu "kompliziert".
 
Hauptsache wieder ein Punkt mehr für die Postinganzahl, gell? :autsch:

Du solltest vielleicht nicht von dir auf andere schließen. Die Anzahl der Beiträge ist doch völlig wurscht. Der sorgfältige Umgang mit den eigenen Quelldateien hingegen ist sehr wichtig.

Es ist einfach hilfreich für einen selber, den Überblick zu behalten und vor allem auch, später sich schnell wieder einzulesen, wenn der Code so formatiert ist, wie man es gewöhnt ist und erwartet. Wenn man nun alles auf einer Ebene belässt, was inhaltlich aber anders ist, dann muss man selbst die geschweiften Klammern zählen und macht sich das Leben nur unnötig schwer.
 
In dem Code ist nichts von einem zweiten Bild zu sehen. Weder wird ein zweites Bild geladen noch gezeichnet.
Ja, dass könnte der Fehler sein. Ich dachte, dass ich zwei Bilder lade und zwar über die folgenden beiden Zeilen:

mt.addImage(bild, 0); // 1. Bild
mt2.addImage(bild, 0); // 2. Bild

Das scheint aber nicht zu stimmen.

Also ist es wahrscheinlich der Befehl:

g.drawImage(bild, x, 20, 50, 50, this);

Aber wie kann ich den von init aus 2 mal aufrufen?

MfG, chrysi.
 
Ja, dass könnte der Fehler sein. Ich dachte, dass ich zwei Bilder lade und zwar über die folgenden beiden Zeilen:

mt.addImage(bild, 0); // 1. Bild
mt2.addImage(bild, 0); // 2. Bild

Das scheint aber nicht zu stimmen.

Also ist es wahrscheinlich der Befehl:

g.drawImage(bild, x, 20, 50, 50, this);
Weder noch, das einzige Bild wird hier geladen:
[JAVA=16]bild = getImage(getCodeBase(),"./desktop2.jpg");[/code]

Aber wie kann ich den von init aus 2 mal aufrufen?
Und diese Frage zeigt mir, dass Dein Vorhaben in Relation zu Deinem Kenntnisstand recht ambitioniert ist ;-)
Ist nicht böse gemeint. Aber für das was was Du vorhast fehlen Dir die Grundlagen.
 

Zurück
Oben