Announcement

Collapse
No announcement yet.

Verständnisfrage Text in Fenster anwachsen lassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisfrage Text in Fenster anwachsen lassen

    Hy, bin Anfänger in JAVA und bearbeite das JAVA-Buch der Autoren Guido Krüger und Thomas Stark, 6. Auflage. Verlag Addison-Wesley

    Ich bin bei den Fenstern über java.awt.* und der Klasse Frame.

    Ich habe ein Beispiel, dass den Text größer werden lässt. Das ist alles voll verständlich.

    Was ich nicht verstehe ist, dass es nur eine if-Abfrage gibt, aber der Text dennoch größer wird. Kann mir das jemand erklären???

    [highlight=Java]
    import java.awt.*;
    import java.awt.event.*;

    /**
    * @author Lerando
    *
    */
    public class GrafikBeispiel
    extends Frame
    {

    /**
    * @param args
    */
    public static void main(String[] args)
    {
    GrafikBeispiel wnd = new GrafikBeispiel();
    }

    public GrafikBeispiel()
    {
    super("GrafikBeispiel");
    addWindowListener(new WindowClosingAdapter(true)); //Klasse für das Schliessen des Fensters
    setBackground(Color.white);
    setSize(640,480);
    setVisible(true);

    }

    public void paint(Graphics g)
    {
    //Anwachsender Text
    Font font = getFont();

    if (font.getSize() <= 64)
    {
    setFont(
    new Font (
    font.getFamily(), font.getStyle(), font.getSize() +1 ));

    g.drawString("Isch bins", 40, 100);
    }
    g.drawString("Isch bins", 40, 100);

    }

    }

    [/highlight]

    In paint(Graphics g) ist nur die if-Abfrage.

    Ich habe versucht mich durch die Klassenbeschreibungen zu wühlen, habe aber keine schlüssige Erklärung gefunden.

    Im Anhang sind die beiden Dateien, falls jemand es betrachten möchte. Die Dateien waren beide in der (defaultPackage).

    Vieelen Dank.

    Gruß Lerando
    Attached Files

  • #2
    der text wird 64x größer gemacht
    Christian

    Comment


    • #3
      paint wird immer und immer wieder aufgerufen. Das Fenster wird ständig neu gezeichnet, wenn Du z.B. die Maus darüber bewegst. Wenn Du jetzt bei jedem Durchlauf den Zähler um eins erhöhst, dann wird der Text langsam (oder auch ziemlich schnell) größer. Ist der Font dann 65 Pixel groß wird einfach nur noch der Text ausgegeben, die Größe bleibt ab diesem Zeitpunkt gleich groß.

      Der fett markierte Teil ist der ausschlaggebende Punkt:
      new Font (font.getFamily(), font.getStyle(), font.getSize() +1 )
      Zuletzt editiert von fanderlf; 22.02.2012, 14:33.

      Comment


      • #4
        Das heißt, dass paint immer mehrmals feuert, obwohl eigentlich die if-Abfrage in den anderen Methoden nur eine if-abfrage ist.

        Meine Vermutung liegt ja darauf, dass paint solange feuert bis es keine Unterschiede in der paint-umgebung mehr gibt und sich so dann schließt, da es ja kein close gibt.

        Ich weiß nicht, ob das so verstanden werden kann. Eine andere Erklärung habe ich nicht.

        Vielen Dank für die tolle Antwort.

        Gruß Lerando

        Comment


        • #5
          Das heißt, dass paint immer mehrmals feuert, obwohl eigentlich die if-Abfrage in den anderen Methoden nur eine if-abfrage ist.
          Der Satz ist unverständlich. PAINT feuert nicht, PAINT wird aufgerufen, wenn es erforderlich ist das Fenster neu zu zeichnen. Dies wird vom System festgestellt. Dieses informiert das Fenster, dass es sich neu zeichnen muss. PAINT wird aufgerufen. Was das mit dem if bedeuten soll, kann ich nicht verstehen. Das if ist hier auch nur ein if. Ein ganz normales if.

          Meine Vermutung liegt ja darauf, dass paint solange feuert bis es keine Unterschiede in der paint-umgebung mehr gibt und sich so dann schließt, da es ja kein close gibt.
          Nein, PAINT feuert nicht und es gibt auch kein close?? Wo steht dieses? Was sollte geschlossen werden?

          In deinem Beispiel wird im ersten PAINT-Aufruf 64x der Text in einer steigenden Größe ausgegeben. Das ergibt den Effekt eines wachsenden Textes. Hat der Font seine Größe von 64 erreicht, wird immer nur der Text in der aktuellen Größe ausgegeben. Damit wird das Fenster bei Größenänderungen u.a. neu gezeichnet. Die Mausbewegung führt allerdings nicht zu einem Aufruf von PAINT.

          Die Erklärung von fanderlf ist insoweit zu korrigieren, dass eine Mausbewegung nicht zum Paint führt und das die "Animation" nicht in den ersten 64 Aufrufen von PAINT erfolgt, sondern einmalig beim ersten zeichnen des Fensters. Der Zähler wird also nicht bei jedem Durchlauf erhöht, sondern die Schleife wird einmalig abgearbeitet

          In deinem Zip fehlt eine Klasse (Ablauf...)
          Wozu da jemand der Meinung war, für das Schließen eine eigne Klasse zu implementieren erschließt sich nicht. Das ist unnötig


          [highlight=java]


          import java.awt.Color;
          import java.awt.Font;
          import java.awt.Frame;
          import java.awt.Graphics;
          import java.awt.event.WindowAdapter;
          import java.awt.event.WindowEvent;

          public class GrafikBeispiel extends Frame
          {
          public static void main(String[] args)
          {
          GrafikBeispiel wnd=new GrafikBeispiel();
          }

          public GrafikBeispiel()
          {
          super("GrafikBeispiel");
          addWindowListener(new WindowAdapter()
          {
          @Override
          public void windowClosing(WindowEvent e)
          {
          System.exit(0);
          }
          });
          setBackground(Color.white);
          setSize(640,480);
          setVisible(true);
          }

          @Override
          public void paint(Graphics g)
          {
          Font font=getFont();
          if(font.getSize()<=64)
          {
          setFont(new Font(font.getFamily(),font.getStyle(),font.getSize ()+1));
          g.drawString("Isch bins",40,100);
          }
          g.drawString("Isch bins",40,100);
          }

          }

          [/highlight]
          Zuletzt editiert von Christian Marquardt; 22.02.2012, 21:49.
          Christian

          Comment


          • #6
            Oh ok sorry dann meinerseits. Ich dachte das Fenster wird nur auf Bedarf neu gezeichnet. Wird Paint regelmäßig in einer Schleife aufgerufen? Ansonsten würde das ganze ja unregelmäßig größer werden und keine flüssige Animation.

            Comment


            • #7
              Wie in Windows WM_PAINT wird das PAINT hier aufgerufen. Wenn das Fenster neu gezeichnet werden muss. Bsp. wenn es von anderen uberdeckt wurde, teilweise aus dem Bildschirm ragt usw.
              Christian

              Comment

              Working...
              X