- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: [Java] repaint() plötzlich funktionslos!

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624

    [Java] repaint() plötzlich funktionslos!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Guten Morgen!
    Seit gestern Abend versuche ich eine Animation mit einem Thread auf den Bildschirm zu zaubern, aber irgendwie wird die repaint-Methode nicht mehr ausgeführt, der Thread läuft aber vernünftig durch, wie mir println() zeigt!
    Hier der Code:

    1. Test_main.java -> Hauptklasse
    Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test_main
    {
      public Test_main()
      {
    
      }
    
      public static void main(String[] args)
      {
        Test_under frame = new Test_under("Test");
      }
    }
    2. Test_under.java -> geerbtes JFrame -> von hier aus wird der Thread gestartet
    Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test_under extends JFrame
    {
      public Test_under(String title)
      {
        super(title);
        addWindowListener(new WindowAdapter()
        {
          public void windowClosing(WindowEvent evt)
          {
            System.exit(0);
          }
        });
    
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int frameWidth = 250;
        int frameHeight = 250;
        setBounds(((d.width / 2) - (frameWidth / 2)) , ((d.height / 2) - (frameHeight / 2)) , frameWidth , frameHeight);
    
        Container cp = getContentPane();
        cp.setLayout(null);
    
        Test_panel panel = new Test_panel();
        cp.add(panel);
    
        setResizable(false);
        setVisible(true);
        
        Test_panel.startIntro();
      }
    }
    3. Test_panel.java -> geerbtes JPanel -> hier ist der Thread mit der repaint()-Funktion
    Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test_panel extends JPanel implements Runnable
    {
      int x = 0;
      int y = 0;
    
      public Test_panel()
      {
        setBounds(0 , 0 , 244 , 218);
        setBackground(Color.WHITE);
        setVisible(true);
      }
    
      public static void startIntro()
      {
        Thread intro = new Thread(new Test_panel());
        intro.start();
      }
    
      public void run()
      {
        for(int i = 0 ; i <= 100 ; i++)
        {
          x = i;
          y = (i / 2);
    
          repaint();
    
          System.out.println(i);
    
          try
          {
            Thread.sleep(100);
          }
          catch (InterruptedException e){}
        }
      }
    
      public void paint(Graphics g)
      {
        super.paint(g);
        
        g.drawRect(((244 / 2) - (x / 2)) , ((218 / 2) - (y / 2)) , x , y);
      }
    }

    Vielleicht kann mir ja jemand weiterhelfen!?

    Danke für eure Mühe!
    Viele Grüße
    Florian

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Du erzeugst ein anderes TestPanel in startIntro, als das was Du in Test_under verwendest.

    Ich nehme an Du meinst in startIntro:

    new Thread(this);

  3. #3
    voidpointer
    Gast
    Hallo,

    new Thread(this) geht leider nicht in einer statischen Methode.

    Meine Empfehlung:
    - startIntro ersatzlos streichen
    - in Test_under (new Thread(panel)).start() aufrufen
    - paintComponent() anstelle von paint() überschreiben
    - vor dem Zeichnen des Rechtecks die Farbe setzen

    Gruß, Achim.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Simmt, aber die muss aber auch nicht static sein.

    Stattdessen
    Code:
        Test_panel panel = new Test_panel();
        cp.add(panel);
    
        setResizable(false);
        setVisible(true);
       
        panel.startIntro();
    und

    Code:
      public void startIntro()
      {
        Thread intro = new Thread(this);
        intro.start();
      }
    Dann läuft's bei mir.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hallo ihr beiden! :o)
    Danke erstmal für eure Hilfe, ich habe mich damit nämlich gestern abend totprobiert! ;o)
    Jetzt funktioniert es und ich bin glücklich!
    Als nächstes muss ich diese Funktionen nur noch in mein großes Programm übernehmen, das dürfte die nächste Hürde sein, bei 1500 Zeilen Code verliere ich langsam den Überblick! ;o)

    paintComponent() anstelle von paint() überschreiben
    vor dem Zeichnen des Rechtecks die Farbe setzen
    Tue ich normalerweise auch, vor allem wegen der Rendering-Funktionen!
    Und die Farben nutze ich normalerweise auch sehr gerne! ;o)

    Nunja, danke nochmal für eure Hilfe! :o)

    Viele Grüße
    Florian

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress