# Persönlicher Wecker mit Sprüchen - soll im Hintergrund laufen



## Jasi (7. September 2004)

*Anfänger: Persönlicher Wecker mit Sprüchen - soll im Hintergrund laufen*

Hallo

Ich möchte einen Wecker programmieren.  Alles was ich tun muss ist doch eigentlich die Zeit auslesen und ne mausbewegung zB als Abbruch......  ne graphische Oberfläche brauche ich im Grunde erstmal nicht. 

*Der Plan:  Ich möchte das im Hintergrund laufen lassen. Es würde reichen das ganze im cmd zu starten.  Das Ausschalten funktioniert über ne mausbewegung oder nen tastenklick....    * 

Mein Problem:  Bisher hab ich nur immer mit Teilstücken rumprogrammiert und nur mal mit Together J ne ordentliche code struktur hinbekommen.  Es würde reichen, wenn der code schlampig ist.  

Ich möchte das ganze alleine machen, weiß aber nicht wo ich anfangen soll und worauf ich achten muss... 

Wie fange ich das projekt überhaupt an?  Den standard code zum uhr auslesen und mausbewegung den werd ich sicher noch finden.  ich werde dann aber höchstwarscheinlich Fragen zur Einbindung des codes haben.. Ich hoffe, da kann ich mich hier an die Leser wenden.  

Ich möchte das Projekt echt gerne von Anfang bis zum Ende bringen. Aber ich brauche hilfe.... 

Danke schonmal!
Jasi


----------



## teppi (8. September 2004)

Dein Projekt sollte nicht allzu aufwendig werden ... 

Teil dir dein Projekt einfach in kleine Aufgaben auf: 

- Du könntest bspw. zuerst versuchen den Timer laufen zu lassen. 
- Dann die Reaktion auf bestimmte Zeitpunkte zu realisieren. 
- Dann das Einbinden der Sprüche, wie auch immer du dir das vorstellst 
- .. und dann vielleicht noch das Abbrechen der Applikation. Obwohl ich das Programm an deiner Stelle einfach beenden würde, wenn der Alarm ausgelöst wurde.   

Bei alldem solltest du darauf achten, dass du das Programm modular aufbaust ..

Ein guter Einstiegspunkt ist sicherlich die Klasse "Date" ...


----------



## Jasi (9. September 2004)

Also ich hab jetzt ein Applet gemacht in dem ne Uhr läuft und ne lustige Animation. dem füge ich dann noch den Sound zu..  zB so Geschrei von wegen:  AUUUFWACHEN  !

 

Das Prob ist, dass ich das Applet nich als .exe machen kann. aber ich dachte mir es kann ja nicht so schwer sein, das als eigenständigen Teil aus einem anderen Programm zu starten.  
Dh, ich hab ein Programm, das ja auch die ganze Zeit eh im Hintergrund laufen muss und das ruft dann zu einem bestimmten Zeitpunkt dieses Applet auf....

Ist das so realisierbar?   

Wenn nicht, wie kann ich das ganze sonst umsetzen, wenn das mit dem Applet nich geht?


----------



## teppi (10. September 2004)

Da du ja zum Starten eines Applets normalerweise einen Browser  oder Appletviewer brauchst, würde ich ganz einfach aus dem Applet eine Applikation machen .. dann kannst du ganz einfach eine Endlosschleife implementieren, welche den "Alarmteil" aktiviert sobald Zeitpunkt == x ist ..  

Mit einer Batch Datei kannst du die Applikation dann auch einigermaßen komfortabel starten ..


----------



## Jasi (19. September 2004)

hmmm . Also wie ich die Abfrage nach der Zeit mache, ist mir wohl klar. Aber: 

-  wie mach ich denn aus einem Applet eine Applikation?   
-  was ist eine batch - Datei  
-  die Endlosschleife checkt einfach nur die Zeit, oder? und sobals Zeit x erreicht ist, wird die 'Applikation' gestartet. Korrekt? 

(Habe solange nichts von mir hören lassen zu diesem Thema, weil ich ne Prüfung hatte. Jetzt bin ich wieder voll dabei - allerdings immernoch ziemlich ratlos.)  

:-(


----------



## Batou (19. September 2004)

komisch, was ist mit dem Thread passiert?

in stop() und destroy() wirst du ja sicher nicht allzuviel machen. Also sollte es für die Intialisierung
reichen, wenn du den Code, den du in init() und start() stehen hast in die main()-Methode
schreibst.
Oder du rufts in main() die beiden Methoden einfach auf.

der run()-Methode nach verwendest du einen Thread? Also muss die Klasse
entweder "extends Thread" oder "implements Runnable" beinhalten, damit der
Thread weiterhin funktioniert.

eine Batch-Datei (Batch = Stapel) ist nur eine Art Startscript für die Anwendung,
an sich sollte aber "java MeineUhr" reichen, je nachdem wie du das mit dem
Aufrufen etc machen willst.


----------



## Jasi (19. September 2004)

Ja danke... mit hilfe deiner Tipps und Google hab ichs hinbekommen    ich hab in der batch datei auch nur "java GetUp"  geschrieben und das funktionierte.. Nur wurde das Konsolen Fenster nicht unterdrückt........   

So. Weiter:

Das Programm soll nur um eine bestimmte, vorher angegebene Uhrzeit starten. Als Wecker eben.  Wie realisiere ich das?    WO muss ich die Schleife reinpacken in der bei einer Zeit x die Applikation startet?


----------



## teppi (20. September 2004)

Ähm .. wenn du die komplette Zeitfunktion aus der Java Applikation herraus nimmst, brauchst du diese Applikation eigtl. nicht mehr ..  

Dann kann man doch gleich irgend ein externes Programm nehmen und sagen starte um 20:15 Uhr Alarm.wav oder irgendwie so .. 

Was macht denn jetzt deine Applikation, außer irgend einen Sound bzw. Text auszugeben. ?  Es macht nur Sinn, wenn sie dauerhaft im Hintergrund läuft und du verschiedene Alarmtermine irgendwo eintragen kannst ..  (Siehe meine Nachricht  an dich) ..


----------



## Vincentius (20. September 2004)

> _Original geschrieben von Jasi _
> *Das Programm soll nur um eine bestimmte, vorher angegebene Uhrzeit starten...*


Falsch! Das Programm soll beim Hochfahren des Systems gestartet werden, sonst kannst Du ja die aktuelle Uhrzeit gar nicht checken.  Du kannst zum Beispiel versuchen, die Batch-Datei über die Autostart-Funktion von Windows, zu starten. 

Sobald das Programm erstmal läuft, kannst Du dann in der *run()* Methode (vorausgesetzt Deine Klasse implementiert *Runnable*) in bestimmten Zeitabständen die aktuelle Zeit überprüfen:

```
public void run() {
        while (true) {
            try {
                checkTime();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void checkTime() {
        // checke hier die Zeit und führe ggf. die gewünschte Operationen aus
    }
```
Damit der Thread gestartet wird, musst Du es in dem Konstruktor aktivieren:

```
Thread thread = new Thread(this);
thread.start();
```


----------



## Jasi (20. September 2004)

Also in der Applikation sieht man ein Bild und ein gif, das durchs Bild läuft. Zudem wird ein sehr unangenehmer 'Aufwach Sound' abgespielt...  DAS ist die Applikation. 
Aber die soll ja nicht die ganze Zeit laufen.      Wie ich sie nun im Hintergrund laufen kann weiß ich nicht.  Reicht das echt, wenn ich einfach im run ne Schleife einbau die erst die Uhrzeit checkt und dann zu der gewissen Uhrzeit in die 'run' Funktion wechselt und die Applikation DANN erst richtig startet?   

Für die Eingabe der gewünschten Zeit x brauch ich ja erstmal keine gui. Das soll ja erstmal überhaupt laufen. 

Also in der run() läuft die Warteschleife, die dann über start() die eigentliche Applikation startet!?


----------



## teppi (20. September 2004)

Es ist eigentlich egal ob die Methode start( ) .. startGUI( ) oder was sonst heisst .. 

Wichtig ist, dass der Thread mit dem Timer halt  alleine läuft .. und erst endet und die andere Methode aufruft , wenn der gewünschte Zeitpkt eintritt ..


----------



## Vincentius (20. September 2004)

> _Original geschrieben von Jasi _
> *Also in der Applikation sieht man ein Bild und ein gif, das durchs Bild läuft. Zudem wird ein sehr unangenehmer 'Aufwach Sound' abgespielt...  DAS ist die Applikation.
> Aber die soll ja nicht die ganze Zeit laufen.      Wie ich sie nun im Hintergrund laufen kann weiß ich nicht.  Reicht das echt, wenn ich einfach im run ne Schleife einbau die erst die Uhrzeit checkt und dann zu der gewissen Uhrzeit in die 'run' Funktion wechselt und die Applikation DANN erst richtig startet?
> 
> ...



Hallo Jasi,

ich glaube, Du bringst viele Sachen durcheinander:

1. Das Starten von einem Programm bedeutet nicht automatisch, dass man eine GUI anzeigt. Öffne mal den Task-Manager unter Windows und schaue Dir die ganzen Programme an, die immer im Hintergrund laufen, von dennen Du nie was mitkriegst. 

2. Wann und ob überhaupt Du eine grafische Oberfläche anzeigst, ist Dir überlassen, denn ein Java-Programm ist nicht unbedingt ein Applet oder ein Fenster.

3. Die *run()* Methode in meinem letzten Beitrag soll eben im Hintergrund laufen (ohne die GUI anzuzeigen) und in bestimmten Zeitabständen die *checkTime()* Methode aufrufen (die musst Du dann selbst implementieren). Wenn die *checkTime()* Methode feststellt: "Aha, es ist soweit", ruft sie halt eine weitere Methode auf, die dann eine Oberfläche zusammenbaut und anzeigt (das kann z.B. ein *JFrame* sein). Du kannst natürlich die Oberfläche gleich beim Starten des Programms zusammenbauen und dann nur auf _"visible"_ setzen, wenn's soweit ist.

Also, ich hoffe, ich konnte Dir helfen  

Gruß
Vincent


----------



## Jasi (20. September 2004)

JAA JUHUU   

  tuts.

Aber da ich ja eine Frau bin, bin ich längst noch nicht befreidigt. Allerdings stell ich mich irgendwie blöder an als ich eigentlich bin. 

Wie spiel ich denn nun sound ab   solange das fenster offen ist soll einfach ein sound gespielt werden.   Die Funktion ist play() (oder loop) aber ich bekommte schon die Initialisierung nicht hin. Hab noch nie Sounds eingebaut. 

import javax.sound.sampled.AudioFileFormat;  

Mein Sound Example hatte ich von hier 
Aber das bezieht sich ja alles auf ein Applet und keine Applikation...  
Was muss ich also importieren wenn ich ein wav abspielen möchte?  Wie initialisiere ich ein soundFile ?


----------



## teppi (21. September 2004)

Handbuch der Java Programmierung 

Java ist auch nur eine Insel 

Java Programmierhandbuch 

...


----------



## Jasi (22. September 2004)

Hier  ist aber wieder nur die Applet version... Obwohl ich das aus der Applikation - Beschreibung kopiert hab meckert der . Ich müsste warscheinlich java Applet importen...   Weil: er kennt AudioClip nicht. 

AudioClip clip;
clip = Applet.newAudioClip(newAudioClip(new URL("file:/sound/clip.au"));

Importiert habe ich folgende Sachen:

import java.awt.*;
import java.util.*;
import java.awt.event.*; 
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.sound.sampled.AudioFileFormat;  

In der Reference stehen nur so komische Sachen drin von wegen Audio FormatFile... 

Direkter Linke hier 
.


----------



## Jasi (22. September 2004)

Och menno.   Hilfe bitte !   Ich sitze hier wie der Ox vorm Berg.


----------



## Vincentius (22. September 2004)

Hallo,

ich glaube, auf dieser Seite: Gesampelter Sound  findest Du Deine Antworten.


----------



## Jasi (22. September 2004)

Ich bin leicht schockiert.  Ist das echt so aufwendig n sound abzuspielen? 
Ich dachte ich müsste nur den Typ importieren, ein Objekt erstellen und könnte direkt 'play' sagen.


----------



## Jasi (22. September 2004)

Ich schaffs auch nicht das komplette Programm das da als Beispiel steht in mein Weckerprogramm eizubinden.  Weil beide ja ne main methode haben und diese try und catch sachen...  
Da mein Wecker aber so keine Funktion hat, werde ich dieses Programm wohl einfach verwerfen. Weckt er halt nur taube.  
Klar, als Applet wär das ganze realisierbar. Aber nicht so wie ich mir das denke, dass es ein eigenständiges Programm ist und so.  

Trotzdem danke, dass ihr mir geholfen habt.  



*edit*  zu erwähnen wäre noch gewesen, dass das mein erstes Projekt war. Alles vorher waren im Kurs nur so Programmfetzen wo man mal ne Schleife macht oder so, aber nichts zusammenhängendes.  Schade.


----------



## Vincentius (22. September 2004)

Halt, nicht sofort aufgeben!  

Ich habe das Beispiel soweit wie möglich vereinfacht. Nimm diese Methode hier:
	
	
	



```
private static void playSampleFile(String name) throws Exception {
        //AudioInputStream öffnen
        AudioInputStream ais = AudioSystem.getAudioInputStream(new File(name));
        AudioFormat format = ais.getFormat();
        //Clip erzeugen und öffnen
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(ais);
        //Clip abspielen
        clip.start();
        while (true) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                //nothing
            }
            if (!clip.isRunning()) {
                break;
            }
        }
        clip.stop();
        clip.close();
    }
```
Also noch einfacher geht es nicht.  

Gruß
Vincent


----------

