Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet.

Diskutiere JLabel wird beim ändern der Schriftart immer neu gezeichnet. im AWT, Swing, JavaFX & SWT Bereich.
L

LarsxSchmitzx

Hallo,
ich wollte ein Fenster programmieren in dem in einer von JLabel abgeleiteten Komponente die Uhrzeit angezeigt wird. Die Uhrzeit wird in der paintComponent Methode der Komponente in das Label geschrieben. Durch einen extra Thread sollte die Uhrzeit jede Sekunde aktualisiert werden. Ändere ich in der paintComponent Methode jedoch die Schriftart, brauche ich keinen Thread und die Uhrzeit ändert sich automatisch sofort. Durch eine System.out.println anweisung in der paintComponent Methode habe ich gesehen, dass die Methode in einer Endlosschleife immer wieder aufgerufen wird. Meine Frage lautet daher: Wieso wird durch das ändern der Schriftart in der Komponente eine Endlosschleife aufgerufen?
Hier der Quellcode der Komponente:
Java:
[/B]
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.text.SimpleDateFormat;

import javax.swing.Icon;
import javax.swing.JLabel;

public class JUhrLabel extends JLabel implements Runnable {

    public JUhrLabel() {
        super();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String uhrzeit = sdf.format(System.currentTimeMillis());;
        setText(uhrzeit);
    }
    public JUhrLabel(String arg0) {
        super(arg0);
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String uhrzeit = sdf.format(System.currentTimeMillis());;
        setText(uhrzeit);
    }
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                repaint();
            } catch (InterruptedException e) {
                break;
            }
        }
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String uhrzeit = sdf.format(System.currentTimeMillis());
        setFont(new Font(Font.DIALOG, Font.BOLD, 22)); //Kommentiere ich diese Zeile aus und benutze den Thread funktioniert das Programm genau wie es soll.
        setText(uhrzeit);
        System.out.println(uhrzeit);
    }

}
[B]
Hier der Quellcode des JFrames:
Java:
[/B]
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

public class Uhrzeit1 extends JFrame {

    private JPanel contentPane;
    private Thread t;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Uhrzeit1 frame = new Uhrzeit1();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Uhrzeit1() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        setTitle("Uhr Label test");
        
        JUhrLabel lblNewLabel = new JUhrLabel("");
        contentPane.add(lblNewLabel, BorderLayout.CENTER);
//        t = new Thread(lblNewLabel); | Der Thread wird wegen der setFontanweisung nicht benötigt
//        t.start(); 
    }

}
[B]
Vielen Dank für jeden Tipp.
 
L

LimDul

Grundsätzlich sagt repaint nur "Zeichne dich bei nächster Gelegenheit neu". Wann genau paintComponent aufgerufen wird, hast du keinen Einfluss drauf.

Aber in paintComponet sollte man nur Objekte zeichnen und nicht manipulieren.

Sinnvoller ist es im Thread über SwingUtils den Text zu setzen (und den Font nur am Anfang) und dann repaint aufzurufen.
 
mrBrown

mrBrown

Und als Ergänzung: setFont sagt der Komponente, dass sie neu gezeichnet werden muss, deshalb wird paintComponent in einer "Endlosschleife" ausgeführt.
 
Thema: 

JLabel wird beim ändern der Schriftart immer neu gezeichnet.

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben