paint(Graphics g) { unbekannt in try{} / catch{} }?

Status
Nicht offen für weitere Antworten.

Dilandau

Aktives Mitglied
warum kann drawString in try und catch nimmer aufgelöst werden?

Code:
  public void paint(Graphics g) {

      HIER FUNKTIONIERT g.drawString NOCH
 

    try {

      String aLine = "";

      URL text = new URL(getCodeBase(), "tanach.txt");

      BufferedReader br = new BufferedReader (new InputStreamReader(text.openStream()));

      int vn; //verse number

      while(null != (aLine = br.readLine())) {

        vn++;
	g.drawString(vn, 0,0);             <<<--------------- .drawString HIER UNBEKANNT


      }

      br.close();

    }

    catch(IOException e) {
      //Graphics g = this.getGraphics();
      //g.drawString(getMessage(e), 0, 0);            <<<----- das selbe
    }

  }
 
Du liest in einem Paint-Aufruf eine Datei aus???

Eigentlich geht es beim paint-Aufruf darum, so schnell wie möglich zu zeichnen...
Mein Vorschlag: lies die Datei in einem eigenen Thread ein, und speichere sie z.B. in einem Vector.

Code:
public class MyPanel extends Panel{
  private Vector data = new Vector();
  private Exception exception;

  public void read(){
    Thread thread = new Thread(){
       public void run(){
          try{
            ...  // InputStream aufrufen
            while(null != (aLine = br.readLine())) {
              data.add( aLine );
              repaint();
            }
            ... // InputStream schliessen
          }
          catch( IOException ex ){
            exception = ex;
          }
       }
    }
    thread.start();
  }

  public void paintComponent( Graphcis g ){
    if( exception == null )
      g.drawString( data.size(), 0, 0 );
    else
      g.drawString( exeption.getMessage(), 0, 0 );
  }
}

Gruss Ben
 
das mit dem paint war nur ein versuch, so schnell wie machbar etwas zu sehen von der datei. das programm soll letztendlich nur auf kommando von aussen überhaupt anfangen, etwas zu zeichnen (und vielleicht beim resizen des fensters zu refreshen).
gut wenn die datei schon im hintergund geladen wurde. wenn nicht, wie könnte das programm dann darauf warten, vor dem zeichnen? oder wers ganz flexibel mag, es wird dann nur bis da gezeichnet, wieviel schon geladen worden ist, dann gehts etwas langsamer weiter. die datei ist aber nicht lang und der eigentliche beabsichtigte parsvorgang beim zeichnen aber verhältnisg sehr komplex, so daß ladezeiten kaum deutlich werden. denkbar wäre, die datei im hintergrund einmal parsen zu lassen, bevor überhaupt irgendwas getan werden kann.

startet der read thread automatisch oder muss ich den manuel aufrufen?

btw, warum exception private und nicht static?
 
Ach so, das erklärt einiges.

Du musst einfach dafür sorgen, dass im Paint-Aufruf nur noch gezeichnet werden kann. Alle Berechnungen sollten schon im voraus gemacht sein.
Und wenn die Berechnungen nicht fertig sind: nicht warten, sondern nur den Teil zeichnen, den du schon hast.

Nur so kannst du verhindern, dass du ein graues Fenster bekommst (Ein Programm mit einem grauen Fenster wird von jedem User gelöscht...)

read() musst du noch aufrufen.

wieso nicht static: andere Frage, wieso sollte es static sein? Was für einen Sinn hätte das?
Es könnte sein, dass du irgendwann mal mehrere Dateien laden willst. Wenn dann einmal eine Exception auftritt, würden alle Panels diesen Fehler melden... macht irgendwie keinen Sinn.

Verzichte wann immer möglich auf static, hat sich bewährt :wink:

Gruss Beni
 
was ist unterschied von private und static? das eine sieht mir wie eine alternative zu public aus, während static die variable für alle meine routinen verfügbar macht. private impliziert aber anscheinend static, da du die variable in einer unterroutine benutzt??

für kurzweil ist in jedem fall gesorgt, da das applet sofort nach dem laden sich weiss macht und ein paar vielversprechende default-kreise präsentiert, deren geheiminisse nur darauf warten, mit user-eingaben entdeckt zu werden.

wie soll ich read() aufrufen, etwas von init()? später aber mal auch von javascript, sobald da eine andere als die default datei ausgewählt worden ist. das read muss aber, sofern ich das verstanden habe, sofort zurückkehren udn der thread löppt von selbst, ist das so?

wenn der teil, den ich schon habe, gezeichnet worden ist, wie warte ich dann auf den rest? da kann ich gleich selber laden.

paint() wirds vielleicht garnicht geben, da nur auf kommando etwas gezeichent werden soll. es seidenn die berechnungen werden im hintergrund gemacht. aber da gibts keine default werte für sondern die sind eingaben abhängig und müssen dann vom user gestartet werden. und damit können auch erst die zeichnungen starten.

vorher parsen kann man die datei aber schon lassen, das könnte was bringen. quasi umwandeln in eine form, die für die berechnungsroutine leichter verständlich ist.
 
Uaaa, static hat nicht sehr viel mit private oder public zu tun.

Es gibt verschiedene Typen von Variablen: Instanzvariablen und Klassenvariablen.

Die Instanzvariable (ohne static) ist an eine Instanz der "umschliessenden" Klasse gebunden.
Beispiel:
Code:
public class Point{
  public int x, y;
}
Wenn du 15 Points initialisierst ( mit new Point() ) dann existieren 15 x's und 15 y's.

Die Klassenvariable (mit static) ist an die Klasse gebunden, und unabhängig von den Instanzen. Da es eine Klasse nur einmal gibt, gibt es auch jede Klassenvariable nur einmal im Programm.
Beispiel:
Code:
public class Point{
  public int x, y;
  public static int nPoints = 0;

  public Point(){  nPoints++ };
}

Das Beispiel kannst du ausprobieren: initialisiere mal 5 Punkte (mit verschiedenen Koordinaten). Du wirst bemerken, dass die Koordinaten aller Punkte verschieden sind, aber dass die Variable nPoints überall denselben Wert hat.

Und schau dir mal diesen Thread an


privat, protected und public geben dagegen an, wer Zugriff auf eine Variable (oder Methode) hat. z.B. eine private-Variable kann nur innerhalb der Klasse benutzt werden, in der sie deklariert ist. (Schau dir den Link an).

Also: ich muss mal kurz meine Gedanken erklären, die ich hatte als ich diesen Beispielcode schrieb:
Ich hatte es so verstanden: du liest eine Datei aus, und willst dem Benutzer zeigen, wieweit du schon bist. (Darum wird immer wieder die Anzahl gelesener Linien ausgedruckt).
Das fand ich ein bisschen *naja* (auch jetzt noch :wink: ), und darum dachte ich: Schreib ich ein kleines Beispiel, bei dem ein Teil des Codes die Datei lädt, und der andere Teil den Fortschritt zeichnet. Das ist aber auch alles, was dieses Codestück kann.

Es ist so, wie du es schreibst: read() kehrt sofort zurück, und die Datei wird einfach mal so nebenbei geladen.
Der Thread loopt. Wenn ich dich richtig verstehe, ein paar Sekunden.

In der Paint-Methode sollte man gar nicht warten: da lässt du lieber einen Teil grau. So im Sinne if( alleDaten ){ zeichne schöne } else { zeichne klein }

Gruss Beni
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben