L
LarsxSchmitzx
Gast
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:
Hier der Quellcode des JFrames:
Vielen Dank für jeden Tipp.
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]
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]