JLabel repaint() Problem

gnomnase

Grünschnabel
Hallo,

ich arbeite zur Zeit an einer GUI für eine telemedizinische Anwendung und möchte eine kleines EKG simulieren. Im augenblick versuche ich auf einem JLabel ein Polygon zu zeichnen und durch repaint zu aktualisieren. Allerdings funktioniert das repaint() nicht. Ich habe nun mehrere Foren durch, allerdings hat kein Lösungsansatz geholfen. Ich meine ein grundsätzlichen Denkfehler zu machen, der mir leider nicht auffällt.

Hier ein Ausschnitt des Codes. Ich habe ihn in eine extra Klasse ausgegliedert und in ein Frame gepackt damit man etwas sieht.

Code:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class testEKG extends JLabel implements Runnable {
    int[] x_array = new int[200];
    int[] y_array = new int[200];

    public testEKG(){
        this.setSize(300, 300);
        this.setVisible(true);

        for (int i=0; i != x_array.length; i++ ){
            x_array[i] = i+50 ;
            y_array[i] = 150;
        }
    }

    @Override
    public void paint(Graphics g){
        g.setColor(Color.BLUE);
        g.drawPolyline(x_array, y_array, x_array.length);
    }

    public void run() {
        while(true){
            for (int i=0; i != x_array.length; i++ ){
                x_array[i] =  i+50;
                y_array[i] = (int) Math.round(Math.random()*40+10);
                System.out.println(x_array[i] + " -  " + y_array[i]);
                this.repaint();
            }  
        }
    }

    public static void main(String[] arg){
        JFrame frame = new JFrame();
        frame.getContentPane().add(new testEKG());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);

        Thread t1 = new Thread(new testEKG());
        t1.start();

    }

}

Bin für jede Inspiration dankbar. Viele Grüße Benji
 
Solche Probleme hat ich auch schon öfters. Meistens hilft es auf den JFrame ein repaint(), oder auf die ContentPane ein validate() (Normalerweise beim Hinzufügen/Löschen von Childelementen) aufzurufen.
Sollte ja kein Problem sein, den Code etwas umzustrukturieren, damit das möglich ist.
Mfg ^^
 
Erstmal: Klassennamen immer mit grossen Anfangsbuchstaben schreiben!
Du instanzierst ausserdem TestEKG zweimal, das müssen wir ändern:
Java:
public static void main(String[] arg) {
    JFrame frame = new JFrame();
    TestEKG test = new TestEKG();//<----------------------------------------------
    frame.getContentPane().add(test);//<----------------------------------------------
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setVisible(true);
    Thread t1 = new Thread(test);//<----------------------------------------------
    t1.start();
}
 
Zuletzt bearbeitet:
Here you go:

Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class EKGPanel extends JLabel implements Runnable {
 
    int[] x_array = new int[200];
    int[] y_array = new int[200];

    public EKGPanel(){
        this.setSize(300, 300);
        this.setVisible(true);

        for (int i=0; i != x_array.length; i++ ){
            x_array[i] = i+50 ;
            y_array[i] = 150;
        }
    }

    @Override
    public void paint(Graphics g){
        g.setColor(Color.BLUE);
        g.drawPolyline(x_array, y_array, x_array.length);
    }

    public void run() {
        while(true){
            for (int i=0; i != x_array.length; i++ ){
                x_array[i] =  i+50;
                y_array[i] = (int) Math.round(Math.random()*40+10);
                System.out.println(x_array[i] + " -  " + y_array[i]);
                this.repaint();
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] arg){
        JFrame frame = new JFrame();
        
        EKGPanel ekgPanel = new EKGPanel();
        frame.getContentPane().add(ekgPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);

        Thread t1 = new Thread(ekgPanel);
        t1.start();

    }

}
 

Neue Beiträge

Zurück