tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
438
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    AGSzabo AGSzabo ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    73
    Hallo alle Interessenten,

    ich habe ein Applet das beim Ändern der Fenstergröße resized wird und zwar durch Wertzusweisungen in seine .width und .height Attribute. Der Witzt ist, machmal funktioniert dass und manchmal nicht. Ich meine, man sieht zwar an der Grauen Box dass das Applet größer wird, aber die Grafik darin "kommt nicht mt". Koennte es sein, dass irgendwas mit dem Timing nicht stimmt, dass zB die Update-Routine für den Breitenwert noch läuft wenn das selbe für die Höhe aufgerufen wird? Muss ich da irgendwie Signale setzen? Oder kann ich iregndwie erreichen, dass das Update erst stattfindet, wenn ich beide Werte also Höhe und Breite fertig zugewiesen habe?

    Klar ist mir blos, dass automagisch

    Code :
    1
    
    public void update(Graphics g) { paint(g); }

    aufgerufen wird wenn ich die Attribute der Höhe oder der Breite verändere. Das Programm im Source findet ihr da: http://www.majorchaos.de/hitomi.java und das kompilierte Applet mitsamt zugehörigem html und script: http://www.majorchaos.de/hitomi.html (mach das Fenster mit dem Titelleistenbutton kleiner und größer um das Problem zu sehen).

    Also woran liegts? Bzw wie mache ich " Warten auf Signale" wenn das nötig ist?


    ps: wenn ich das Fenster an der Ecke packe und größer oder kleiner ziehe, dann funktioniert es immer mit der Größenänderung. Blos wenn ich die Schaltfläche in der Fenstertitelleiste benutze, gibts probleme, wahrscheinlich weil das zu schnell geht. Ich meine, die Höhe wird verändert während die Änderung der Breite noch nicht abgschlossen ist.

    pps: ich sehe gerade, dass von mir im Script blos der Höhenwert des Applets verändert wird. Der Breitenwert wird von der HTML Engine automatisch auf 100% des Elternelements gesetzt. Also mir scheint, ich versuche die Höhe zu ändern bevor die neue Breite im Applet "ganz angekommen" ist. ... Oder vielleicht irgendwie umgekehrt...

    ppps: hier ist der paint-Code, der fuer die Bildgröße zuständig ist:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
      public void paint(Graphics g) {
        Dimension d = new Dimension(this.getSize().width, this.getSize().height);
     
        // Create the offscreen graphics context
        if ((offGraphics == null)
         || (d.width != offDimension.width)
         || (d.height != offDimension.height)) {
            offDimension = d;
            offImage = createImage(d.width, d.height);
            offGraphics = offImage.getGraphics();//(Graphics2D)offImage.getGraphics();
        }
     
        // pixel diameter of the full wheel
        if (d.width<d.height) {as = d.width;} else {as = d.height;}
     
        //hack wheelsize to be based on a constant ring width
        if (!fullsize) as = rings*25*2;
        
        
        //status
        if ((null == thisbook && !filenotfound) || hit[5] == null) {
           g.drawString("reading "+filename, 0, 10);
         } else if (filenotfound) {
           g.fillRect(0, 0, d.width, d.height);
           g.drawString("file not found", 0, 10);
        }
        if (null != thisbook) {
     
          // Erase the previous image
          offGraphics.setColor(colors[colorstyle][back]);
          offGraphics.fillRect(0, 0, d.width, d.height);
     
          fm = g.getFontMetrics();
          lh=fm.getAscent()+fm.getDescent();
          
          // draw the buttons where they are
          hit[5-(direction+1)/2].paintIcon(this,offGraphics,as-24,0);
          if (fullsize) {
            hit[orientation].paintIcon(this,offGraphics,as-55,0);
            hit[6].paintIcon(this,offGraphics,as-55,31); // LINE
            hit[7].paintIcon(this,offGraphics,as-24,31); // rings with note
            hit[8].paintIcon(this,offGraphics,as-74,0);  // +/-
     
        //draw copyright and version
            offGraphics.setColor(Color.gray);
            offGraphics.drawString(ver,0,as-fm.getDescent());
            offGraphics.drawString(by,as-fm.stringWidth(by),as-fm.getDescent());
     
            //the dots legend
            legend(offGraphics);
          }
     
          //draw the wheel
          pendant(offGraphics);
          printvalue(offGraphics);
     
          // Paint the image onto the screen
          g.drawImage(offImage, 0, 0, null);
        }
      }

    pppps: ich habe irgendwo gelesen dass eine refreshroutine nach 100 millisekuden abgebrochen wird... bin etwas verwirrt davon. vielleicht ist das die antwort auf meine frage? aber was kann ich da machen?
    Geändert von AGSzabo (18.11.08 um 11:26 Uhr) Grund: paint-code eingefügt
     

  2. #2
    AGSzabo AGSzabo ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    73
    Hi,

    nachdem meine lange und komplizierte anfrage nix gebracht hat, hier nochmal das Problem nach meinen neusten Erkenntnissen kurz und bündig: die Routine, die durch paint(Graphics g) aufgerufen wird, dauert länger als 100ms bzw wird dann oder auch wenn der nächste Aufruf von paint() rein kommt, abgebrochen. Sie soll aber immer fertiglaufen bzw der zweite Update sollte warten bis der erste fertig ist. Was kann ich da machen? Auf meinem Laptop, der sehr schnell ist, gibts das Problem nicht.

    danke für euer Verständnis,
    Gruesse,
    AGS

    ps: den source gibts da: http://www.majorchaos.de/hitomi.java, das fertige applet da: http://www.majorchaos.de/hitomi.html


    //edit

    ich habe jetzt die Zeile

    // public void update(Graphics g) { paint(g); }

    auskommentiert, aber das Problem besteht nach wie vor.
    Geändert von AGSzabo (19.11.08 um 19:55 Uhr)
     

  3. #3
    mckruep mckruep ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    57
    Hey,
    weiß nicht genau ob es was bringt aber füg doch mal ein

    update(getGraphics());

    ein vielleicht hilft das wobei im Normalfall auch da ein repaint gemacht wird. aber ein Versuch ist es wert.

    Gruß
     

  4. #4
    AGSzabo AGSzabo ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    73
    Wo soll ich das einfügen und mit welchem Funktionsinhalt?
     

  5. #5
    mckruep mckruep ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    57
    Da rein wo du die Komponenten lädst.
    Wie Inhalt? Einfach so wies da steht ?!
     

  6. #6
    AGSzabo AGSzabo ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    73
    nee, hat nix gebracht. aber danke für dein entgegenkommen.
     

Ähnliche Themen

  1. [C#] Grafik anderer Grafik folgen?
    Von Major18 im Forum .NET Grafik und Sound
    Antworten: 4
    Letzter Beitrag: 13.09.08, 11:51
  2. Antworten: 12
    Letzter Beitrag: 20.06.06, 19:28
  3. Antworten: 4
    Letzter Beitrag: 02.12.04, 13:56
  4. Antworten: 1
    Letzter Beitrag: 13.08.04, 23:04
  5. Antworten: 3
    Letzter Beitrag: 26.01.04, 10:11

Stichworte