Hallo Experten!
Habe folgendes Problem:
Habe ein Programm geschrieben, welches die Zeit von einem Internetzeitserver holt. Es funktionniert folgendermassen: Wenn ich es anwerfe erscheint ein Fenster mit einem Button, sobald ich den Button drücke holt das Proggi die Zeit und gibt sie aus, leider nur über Konsole! Ich will aber, dass die Zeit in einem Textfield im Fenster ausgegeben wird, aber ich weiss nicht wie den eingelesenen String übergeben kann! Denke hat was mit der Schleife zu tun...
Danke für Eure Hilfe
Das Programm:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class SZeit extends Frame //Hauptklasse SZeit, abgeleitet von der vordef. Klasse Frame
{ Color x = new Color(0,0,0);
String str2;
String str;
class CWindowLauscher extends WindowAdapter //Adapterklasse innehalb der Klasse SZeit
{ Color x =new Color (255,220,5);
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
class ActionLauscher implements ActionListener //Ereignisklasse innehalb der Klasse SZeit
{
public void actionPerformed(ActionEvent e)
{
try {
Socket s = new Socket("unics.rrzn.uni-hannover.de",13); //neuer Socket zu rrzn...port 13
BufferedReader is = new //buffered, da zeilenweise ingelesen wird
BufferedReader(new InputStreamReader (s.getInputStream()));
boolean weiter = true;
while ((str = is.readLine())!=null)
{
System.out.println(str); //hier wird die Zeit auf der Konsole ausgegeben
str2=str;
}
System.out.println(str2);
}
catch (IOException a)
{
System.out.println(a);
}
}
}
public SZeit (String titel) //Konstruktor von Fenster(SZeit) und Button
{
super (titel);
setBackground(x);
Button knopf = new Button ("Zeit anzeigen");
setLayout (new FlowLayout());
knopf.addActionListener(new ActionLauscher());
add (knopf);
TextField text = new TextField();
text.setColumns(30);
text.setText("Hier sollte eigentlich die Zeit stehen"+str2);
add(text) ;
addWindowListener(new CWindowLauscher()); //Frame beim WindowListener anmelden
}
public static void main (String [] args) //Mainprogramm
{
SZeit fenster = new SZeit ("Zeit von rrzn.uni-hannover.de"); //neue Instanz der Klassse SZeit erstellen
fenster.setSize (300,150);
//fenster.pack();
fenster.setVisible(true);
}
}
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Deklarierere text als Feld SZeit ("global" in der Klasse verfügbar und nicht nur lokal im constructor), dann kannst Du die Zeit überall mit text.setText(str) ausgeben lassen...
Habe es mal umgeschrieben, aber egal was ich mache, die Zeit wird nicht im Fenster ausgegeben. Komisch ist, dass der gleiche String in der Konsole was ausgibt und im Fenster anscheinend leer ist oder habe ich was Wichtiges übersehen????
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class SZeit extends Frame //Hauptklasse SZeit, abgeleitet von der vordef. Klasse Frame
{ Color x = new Color(0,0,0);
TextField text = new TextField();
String str;
class CWindowLauscher extends WindowAdapter //Adapterklasse innehalb der Klasse SZeit
{ Color x =new Color (255,220,5);
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
class ActionLauscher implements ActionListener //Ereignisklasse innehalb der Klasse SZeit
{
public void actionPerformed(ActionEvent e)
{
try {
Socket s = new Socket("unics.rrzn.uni-hannover.de",13); //neuer Socket zu rrzn...port 13
BufferedReader is = new //buffered, da zeilenweise ingelesen wird
BufferedReader(new InputStreamReader (s.getInputStream()));
boolean weiter = true;
while ((str = is.readLine())!=null)
{
System.out.println(str); //hier wird die Zeit auf der Konsole ausgegeben
text.setText("Test"+str); //hier sollte die Fensterausgabe stattfinden :-(
}
}
catch (IOException a)
{
System.out.println(a);
}
}
}
public SZeit (String titel) //Konstruktor von Fenster(SZeit) und Button
{
super (titel);
setBackground(x);
Button knopf = new Button ("Zeit anzeigen");
setLayout (new FlowLayout());
knopf.addActionListener(new ActionLauscher());
addWindowListener(new CWindowLauscher()); //Frame beim WindowListener anmelden
add (knopf);
add(text) ;
text.setColumns(30);
}
public static void main (String [] args) //Mainprogramm
{
SZeit fenster = new SZeit ("Zeit von rrzn.uni-hannover.de"); //neue Instanz der Klassse SZeit erstellen
fenster.setSize (300,150);
//fenster.pack();
fenster.setVisible(true);
}
}
Doch wird sie, anschließend wird aber auch die leerzeile ausgegeben und damit der Inhalt des TextField überschirben ;-)
Komisch ist, dass der gleiche String in der Konsole was ausgibt
Da gibt er jede Zeile für sich aus...
Wenn Du nur die erste Zeile brauchst, dann würde ich überlegen ob ich den Inhalt mit WHILE durchlaufen lasse.
Hallo! Erstmal Danke für Deine Hilfe. Wie Du schon gesagt hast findet eine Ausgabe im Fenster statt, wird jedoch zum Schluss mit NULL überschrieben, jedenfalls wenn ich text.setText(str); in die while Schleife setze.Was ich nur nicht verstehe, warum wird die Konsolenausgabe nicht überschrieben???? Habe beide Anweisungenen (System.out.println(str); und text.setText(str); in die while Schleife gepackt, aber im Fenster wird es trotzdem wieder überschrieben. Auch eine do-while-Schleife hat mich nicht weiter gebracht. Nur wenn ich in der while Schleife eine zweite while Schleife programmiere, bekomme ich eine Ausgabe im Textfeld, allerdings hängt er dann in einer Endlosschleife... :-(
Weil in der Console bei jeder Ausgabe eine neue Zeile angehängt wird...
Auch eine do-while-Schleife hat mich nicht weiter gebracht.
Da eine Zeile entweder vorhanden sein kann oder nicht würde ich hier statt der Schleife einfach mit IF prüfen ;-) Wenn schon Schleife (bei einer Datenzeile unsinnig), dann mit zusammen mit weitere Bedingung, oder die Ausgabe an eine Bedingung knüpfen...
Gruß
Borlander
Hey, Danke!!! An die if-Anweisung habe ich gar nicht mehr gedacht! Die while - Schleife ist rausgeflogen und durch if erstetzt worden. Und das Beste: Es läuft endlich!!!!! :-)
Gruss Bhen