Announcement

Collapse
No announcement yet.

Nutzung des Timers

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

  • Nutzung des Timers

    Hallo, ich habe folgendes Problem: Möchte zeitgesteuert (über einen Timer) einen Kreis zeichnen lassen, der sich in der Größe verändert (die Größenveränderung ist im untenstehenden Listing noch nicht drin, in der Methode "zeichneKreis()" sind erstmal feste Werte drin, aber das ist erstmal egal - nicht das Problem.)
    Die Lösungsidee war: Von "...main..." aus wird die Klasse GrafikSpielerei aufgerufen. Sie ist von JFrame abgeletet und enthält auch den Timer. Sie ruft die Methode "zeichneKreis()" in der Klasse "Kreis" auf, die von JPanel abgeleitet ist. Wie gesagt, es ist ohnehin noch nicht fertig. Mein Problem ist, dass schon die Klasse "GrafikSpielerei" aus "main" offenbar nicht aufgerufen wird, jedenfalls kommt eine Fehlermeldung (JavaException usw.) Debuggen hat mir auch nichts gebracht. Das zweite Problem ist, dass mir nicht klar ist, an welcher Stelle genau ich den timer aufrufen muss ("timer1.start();").
    Ich mach wahrscheinlich einige dicke Denkfehler, aber ich seh gerade den Wald vor Bäumen nicht
    Wer kann mir ein wenig auf die Sprünge helfen?
    Vielen Dank, Olaf


    -------------------------------------------------------------------------------------------------
    package de.grafikspielerei;

    public class GrafikMain{
    public static void main(String[] args) {
    new GrafikSpielerei("Animierter Kreis");
    }
    }


    package de.grafikspielerei;

    import javax.swing.JFrame;
    import javax.swing.Timer;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;

    public class GrafikSpielerei extends JFrame {

    class TimerListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    kreisZeichnen();
    }
    }

    private Timer timer1;
    private Kreis meinkreis;

    //Konstruktor
    public GrafikSpielerei(String titel) {
    super(titel);

    setSize(400,400);
    add(meinkreis);
    timer1 = new Timer(2000, new TimerListener());
    //timer1.start();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    }

    private void kreisZeichnen() {
    meinkreis.zeichneKreis(100,100,10,10);
    }
    }



    package de.grafikspielerei;

    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.awt.Color;
    import javax.swing.JPanel;
    import javax.swing.border.BevelBorder;


    public class Kreis extends JPanel {
    private BufferedImage bild;
    private Color farbe;

    public Kreis() {
    setSize(400,400);
    setBorder(new BevelBorder(BevelBorder.LOWERED));
    bild = new BufferedImage(getWidth(), getHeight(),BufferedImage.TYPE_INT_RGB)
    Graphics g = bild.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(),getHeight());
    g.dispose();
    farbe = Color.BLACK;
    }

    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(bild, 0, 0, this);
    }


    public void zeichneKreis(int x1, int y1, int breite, int hoehe) {
    Graphics g = bild.getGraphics();
    g.setColor(farbe);
    g.drawOval(x1, y1, breite, hoehe);
    //g.drawOval(mittelpunktWidth-x1, mittelpunktHeigth-y1, x1*2, y1*2);
    }
    }

  • #2
    Du erstellst in deiner Klasse GrafikSpielerei eine Methode startTimer. Die wird von der main aufgerufen. Sinnvoller wäre es ebenfalls das setvisible ebenfalls von da aus zu machen. Wozu der ActionListener ist verstehe ich jetzt nicht. Ich würde das paintComponent des Panels überschreiben

    [highlight=java]
    public class NewJFrame extends javax.swing.JFrame
    {
    private final Timer timer;


    public static void main(String args[])
    {
    java.awt.EventQueue.invokeLater(new Runnable()
    {
    @Override
    public void run()
    {
    NewJFrame n=new NewJFrame();
    n.setVisible(true);
    n.startTimer();
    }

    });
    }

    public NewJFrame()
    {
    timer=new Timer(2000,new ActionListener()
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
    //zeichne deinen Kreis
    }

    });
    }

    public void startTimer()
    {
    timer.start();
    }


    }


    [/highlight]
    Christian

    Comment


    • #3
      Hallo Christian,
      herzlichen Dank! Ich muss darüber nachdenken.
      Viele Grüße, Olaf

      Comment

      Working...
      X