Systemzeit im Swing.JFrame anzeigen

Lautsprecher

Erfahrenes Mitglied
Hallo allerseits,
ich bin gerade dabei mit dem Visual Editor von Eclipse eine Applikation unter Swing zu erstellen.
Um die Systemzeit zu erhalten benutze ich folgende Klasse:

Code:
import java.util.Date;

public class Zeit extends ZeiterfasslungGlasdeckel implements Runnable {
    
	/* Variablen - Deklaration */
	static Thread prozess;
                public  Date Datum;
        
    Zeit() {
        prozess = new Thread(this, "Neuer Prozess");
        prozess.start();
    }

    public void run() {
        while (Thread.currentThread() == prozess) {
            Datum = new Date();
            
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException ie) {
            }
        }
    }

    public static void main (String [] args) 
    {
        
    	/* 1. Objekt proggi wird erstellt und Methode Zeit() aufgerufen */
    	Zeit proggi = new Zeit();
              }
}

In meiner zweiten Klasse Zeiterfassung...Glas.. alle Angeben zum Frame-Aufbau, wie Labels, Textboxen, JTables, etc.

Da ich noch Anfänger bin weiß ich nun leider nicht mehr weiter und ich hoffe jemand kann mir dabei helfen.

Wie zeige ich nun am besten in dem Frame am besten in einem Label die aktuelle Uhrzeit an?

Danke
 
Hi!

Code:
import java.awt.BorderLayout;
import java.awt.Label;
import java.util.Calendar;

import javax.swing.JFrame;

public class Clock extends JFrame {

   private Label label;

   public Clock() {
      super("Clock");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      label = new Label("-----");
      add(label);
      Thread updateSystemTime = new Thread() {
         public void run() {
            while (true) {
               Calendar calender = Calendar.getInstance();
               label.setText("" + calender.get(Calendar.HOUR)
                     + ":" + calender.get(Calendar.MINUTE) + ":"
                     + calender.get(Calendar.SECOND));
            }
         }
      };
      updateSystemTime.start();
      pack();
      setSize(30, 60);
      setVisible(true);
   }

   public static void main(String[] args) {
       Clock clock = new Clock();
   }
}

MfG
Sebastian
 
Zuletzt bearbeitet von einem Moderator:
Hi Sebastian,
erstmal Danke für dein schnellen Support!
Ich bin jetzt mal drüber geflogen und muss sagen , dass ich noch nicht ganz durch
geblickt habe.

1.Mit deiner Klasse Clock kann ich meine Klasse Zeit also rauswerfen?!
2. Ist dein Pgm als eigene Klasse gedacht, und meine "Hauptklasse in welcher der
Frame aufgebaut wird, soll dann auf die Clock-Klasse zugreifen oder ist es sinnvoll
die Code-Stücke in mein Frame-Pgm einzubauen?
Dabei gehen die Fehler schon los wenn ich in der main-Methode:
Clock clock = new Clock(); definiere!
kommt die Fehlermeldung: Clock cannot be resolved a type

Meine main sieht derzeit folgendermaßen aus:
Code:
public static void main(String[] args) {
		ZeiterfasslungGlasdeckel application = new  
                                 ZeiterfasslungGlasdeckel();
		application.show();
	}

Weitere Programmausschnitt:
Code:
/**
	 * This is the default constructor
	 */
	public ZeiterfasslungGlasdeckel() {
		super();
		initialize();
	}
Im JLabel6 möchte ich die Uhrzeit ausgeben:
private JPanel getJContentPane() {
Code:
if (jContentPane == null) {
                jLabel6 = new JLabel();
	jLabel6.setBounds(new java.awt.Rectangle(28, 672, 970, 34));
	jLabel6.setBackground(new java.awt.Color(255, 254, 254));
	jLabel6.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 24));		jLabel6.setText("");
               jContentPane.add(jLabel6, null);
        	}
	return jContentPane;
	}

3. Mir ist es einfach nicht klar, wie man den Übergang von einer zur anderen Klasse baut.
Das läuft soweit ich weiß doch über Vererben ab?
Kann ich also deine Clock-Klasse extends ZeiterfassungGlasdeckel-Klasse setzen
und mit jLabel6 anstelle mit label arbeiten?
 
1. Ja
2. Ich würde die benötigen Code-Blöcke in die "Frame-Klasse" einbauen. Ist meiner Meinung nach am einfachsten.

Also quasi:
Code:
label = new Label("-----");
frame.add(label);
Thread updateSystemTime = new Thread() {
         public void run() {
            while (true) {
               Calendar calender = Calendar.getInstance();
               label.setText("" + calender.get(Calendar.HOUR)
                     + ":" + calender.get(Calendar.MINUTE) + ":"
                     + calender.get(Calendar.SECOND));
            }
         }
      };
updateSystemTime.start();

3.Also mir Vererbung würde ich mir da nix zusammenbauen

MfG
Sebastian
 
Hi Sebastian,
danke nochmals für deine Hilfe, ich glaube ich bin damit schon ein wenig weiter gekommen. Hab jetzt mal ein kleines Testprogramm geschrieben und deinen Code eingebaut. Es gibt jedoch noch ein kleines Problem. Die Uhr wird nun im Frame
angezeigt, läuft aber nicht. Was ist jetzt noch falsch?

Hasta luego

Code:
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.KeyStroke;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.util.*;
import java.util.Calendar;

public class Clock extends JFrame {
	private JLabel test;
	private JPanel jContentPane = null;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Clock application = new Clock();
		application.show();
	
	    Clock clock = new Clock();
	}

	/**
	 * This is the default constructor
	 */
	public Clock() {
		super("Clock");
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		test = new JLabel("-----");
		getContentPane().add(test);
		
		Thread updateSystemTime = new Thread()
		{
			public void run()
			{
				while (true)
				{
					Calendar calender = Calendar.getInstance();
					test.setText("" + calender.get(Calendar.HOUR)
							+ ":" + calender.get(Calendar.MINUTE)
							+ ":" + calender.get(Calendar.SECOND));
				}
			}
			
		};
		updateSystemTime.start();
		pack();
		setVisible(true);
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("Application");
	}

		/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
		}
		return jContentPane;
	}  
}
 
Also, du hast ne ContentPane in der du das Clock-Label addest
Code:
test = new JLabel("-----");
getContentPane().add(test);

Wenn du nun recht weit am Ende
Code:
this.setContentPane(getJContentPane());
die ContentPane neu setzt, überschreibst du diese natürlich und somit ist dann auch selbstverständlich die Uhr nicht mehr zu sehen.

Und dann streiche bitte in der Main
Code:
// TODO Auto-generated method stub
Clock application = new Clock();
application.show();
Brauchst immerhin nicht zwei Instanzen der Clock Klasse.

MfG
Sebastian
 
Hallo!

Schau mal hier:
Code:
package de.tutorials;
 
 import java.awt.event.ActionListener;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.Timer;
 
 public class ClockExample extends JFrame {
 
 	public ClockExample() {
 		super("ClockExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		final Date date = new Date();
 		final JLabel label = new JLabel();
 		final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
 		Timer timer = new Timer(0, new ActionListener() {
 			public void actionPerformed(java.awt.event.ActionEvent e) {
 				date.setTime(System.currentTimeMillis());
 				label.setText(simpleDateFormat.format(date));
 			}
 		});
 		timer.setRepeats(true);
 		timer.start();
 		add(label);
 
 		pack();
 		setVisible(true);
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new ClockExample();
 	}
 }

Gruß Tom
 
Hallo nochmal,
also folgendes, ich habe mein Testpgm nun endlich zum laufen gebracht und soweit,
denke ich einigermaßen verstanden
Danke Dir - Sebastian mit dem Tipp der Main und ContentPane()....

Aber: Ich frage mich immer noch wie ich das ganze in meine Anwendung einbaue.

Mein Pgm ist folgendermaßen aufgebaut:

Ich habe mit dem Visual Editor 12 Labels, 4 Buttons, 3 Textfelder, 1 JTable erstellt.
Dafür hat er dann die ganzen Methoden (ist ja klar) getJTable(), getJButton(), etc.
angelegt.

Desweitern habe ich eine main (eh klar);

Code:
public static void main(String[] args) 
{
ZeiterfasslungGlasdeckel application = new ZeiterfasslungGlasdeckel();
application.show();
}
eine:
Code:
public ZeiterfasslungGlasdeckel() 
{
               super();
	initialize();
}
Code:
private void initialize() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setContentPane(getJContentPane());
		this.setSize(15450, 11050);
		this.setTitle("Firmenname");
	}


und vor allem eine (da weiß ich nicht mehr weiter)
Code:
private JPanel getJContentPane() 
	{
		if (jContentPane == null)
	jLabel6 = new JLabel();
	jLabel6.setBounds(new java.awt.Rectangle(28, 672, 970, 34));
	jLabel6.setBackground(new java.awt.Color(255, 254, 254));
	jLabel6.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 24));		jLabel6.setText("");
				
	jLabel5 = new JLabel();
	jLabel5.setBounds(new java.awt.Rectangle(115, 77, 95, 21));
	jLabel5.setBackground(java.awt.Color.white);
	jLabel5.setText("");
	jContentPane = new JPanel();
	jContentPane.setLayout(null);
	jContentPane.add(jLabel5, null);
	jContentPane.add(getJScrollPane(), null);
	jContentPane.add(jLabel6, null);
	jContentPane.add(getJButton(), null);
	jContentPane.add(getJTextField(), null);
	}
		return jContentPane;
	}
}

Ich hab jetzt versucht nach Sebastians-Pgm, die main zu Ändern die
public ZeiterfasslungGlasdeckel() anzupassen, etc. Immer mit dem Ergebnis,
dass ich zum einen:
- eine leere Frame erhalte oder
- nur oben links die Uhrzeit angezeigt wird
-> sie sollte eigentlich bei setBounds(new java.awt.Rectangle(28, 672, 970, 34));
ausgegeben werden

Ich glaub der Hacken liegt bei der getContentPane(), dass die anderen Components nicht
mehr angezeigt werden
Kann die getContentPane() weiter bestehen? Oder muss ich die add's bzw. setText, setBounds irgendwie in der:

Code:
public Clock() {
      super("Clock");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      label = new Label("-----");
      add(label);
      Thread updateSystemTime = new Thread() {
         public void run() {
            while (true) {
               Calendar calender = Calendar.getInstance();
               label.setText("" + calender.get(Calendar.HOUR)
                     + ":" + calender.get(Calendar.MINUTE) + ":"
                     + calender.get(Calendar.SECOND));
            }
         }
      };
      updateSystemTime.start();
      pack();
      setSize(30, 60);
      setVisible(true);
   }

verbraten



Grüße
 
Zuletzt bearbeitet:
Wie schon erwähnt: Indem du in deinem Programm einfach nen neues Label anlegst und dann den entsprechenden Code kopierst.
Wenn du da jetzt sehr große Probleme hast, können wir das auch gerne mal per ICQ oder so klären. Das hat nämlich jetzt eigentlich nicht mehr viel mit dem Topic zu tun.

MfG
Sebastian
 
Zurück