Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich hatte schon vor ein paar Wochen einen Thread eröffnet, da wollte ich die Track-Infos des aktuellen Songs aus iTunes mit Java abgreifen. Das habe ich nun geschafft. Es klappt alles wunderbar . Folgenden Code habe ich nun da:
Code:
public class Main {
public static void main(String[] args) throws Exception {
IiTunes iTunes = ClassFactory.createiTunesApp();
EventCookie cookie = iTunes.advise(_IiTunesEvents.class, new _IiTunesEvents() {
public void onPlayerPlayEvent(Object iTrack) {
IiTunes iTunes = ClassFactory.createiTunesApp();
IITTrack track = iTunes.currentTrack();
if(track==null) {
System.out.println("Nothing is playing");
} else {
System.out.println("Now playing ==================>");
System.out.println("Titel: " + track.name());
System.out.println("Interpret: " + track.artist());
System.out.println("Album: " + track.album());
System.out.println("");
}
}
});
//First time getting track informations
IITTrack track = iTunes.currentTrack();
if(track==null) {
System.out.println("Nothing is playing");
} else {
System.out.println("Now playing ==================>");
System.out.println("Titel: " + track.name());
System.out.println("Interpret: " + track.artist());
System.out.println("Album: " + track.album());
System.out.println("");
}
Thread.sleep(15000000);
cookie.close();
}
}
Nun läuft das Programm solange wie es hier steht: Thread.sleep(15000000);
Ich hätte nun aber gerne, dass das Programm solange läuft, bis es durch den Benutzer beendet (in eclipse terminated) wird. Wie stell ich das an?
Danke für deine schnelle Antwort. Ich habe das ganze jetzt mal integriert und das sieht nun bei mir so aus:
Code:
package iTunes.def;
import com4j.EventCookie;
import iTunes.def.ClassFactory;
import iTunes.def.IITTrack;
import iTunes.def.IiTunes;
import iTunes.def.events._IiTunesEvents;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Main extends Component implements KeyListener {
public Main () {
this.addKeyListener(this);
}
public static void main(String[] args) throws Exception
{
//
// iTUNES-TRACKS GETTEN
//
IiTunes iTunes = ClassFactory.createiTunesApp();
EventCookie cookie = iTunes.advise(_IiTunesEvents.class, new _IiTunesEvents() {
public void onPlayerPlayEvent(Object iTrack) {
IiTunes iTunes = ClassFactory.createiTunesApp();
IITTrack track = iTunes.currentTrack();
if(track==null) {
System.out.println("Nothing is playing");
} else {
System.out.println("Now playing ==================>");
System.out.println("Titel: " + track.name());
System.out.println("Interpret: " + track.artist());
System.out.println("Album: " + track.album());
System.out.println("");
}
}
});
//First time getting track informations
IITTrack track = iTunes.currentTrack();
if(track==null) {
System.out.println("Nothing is playing");
} else {
System.out.println("Now playing ==================>");
System.out.println("Titel: " + track.name());
System.out.println("Interpret: " + track.artist());
System.out.println("Album: " + track.album());
System.out.println("");
}
//Thread.sleep(15000000);
cookie.close();
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
Wenn ich den Code von dir richtig interpretiere sollte so das Programm beim Drücken der "E"-Taste beenden. Allerdings läuft es bei mir nur einmal durch und dann ist schon Schluss.
Habe dann das mit "setVisisble(true)" vergessen.
"Irren ist menschlich" Und gelernt habe ich jetzt auch was *Thumbs up*
Also bleibt Ihm die TrayIcon-Variante oder die System.in-Variante.
Ich glaube mein Wissen ist noch zu wenig fundiert als dass ich hier anfangen könnte TrayIcons hinzuzaubern .. obwohl das eigentlich auch das Ziel für dieses kleine Programm hier wäre ..
Aber ich nehme mal an das wird dann ziemlich aufwendig.. aber wenn ihr mich an ein Tutorial oder so verweisen könnt, dann wär ich froh drum..
Wie gesagt da stimme ich dir zu. Aber ein setVisible(true) ist dann zwingend, sonst bricht der Thread/Prozess vorher ab.
Um aber eine Alternative zu präsentieren:
So könnte man es auch machen, wenn es eine einefache Konsolenanwendung ist. sonst würde ich gerne die TrayIcon Variante vorziehen.
Code:
import java.io.*;
public class Main {
public Main() {
try {
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
boolean abbruch = false;
String eingabe;
while (!abbruch) {
eingabe = br.readLine();
if (eingabe.equals("exit")){
System.out.println("Es wurde Exit eingegeben");
abbruch = true;
}
System.out.println(eingabe);
}
System.out.println("ich bin draußen");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main (String [] args ){
new Main();
}
}
Ich habe mich jetzt mal ein bisschen mit dem TrayIcon beschäftigt. Sprich, ich habe versucht das Beispiel-Codeschnipsel als erstes mal zum laufen zu bringen.
Code:
import java.awt.*;
import java.awt.event.*;
public class testicon {
public static void main(String[] args) {
TrayIcon trayIcon = null;
if (SystemTray.isSupported()) {
// get the SystemTray instance
SystemTray tray = SystemTray.getSystemTray();
// load an image
Image image = Toolkit.getDefaultToolkit().getImage("bin/tryi.gif");
// create a action listener to listen for default action executed on the tray icon
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
// execute default action of the application
// ...
}
};
// create a popup menu
PopupMenu popup = new PopupMenu();
// create menu item for the default action
MenuItem defaultItem = new MenuItem("Beenden");
defaultItem.addActionListener(listener);
popup.add(defaultItem);
/// ... add other items
// construct a TrayIcon
trayIcon = new TrayIcon(image, "Tray Demo", popup);
// set the TrayIcon properties
trayIcon.addActionListener(listener);
// ...
// add the tray image
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(e);
}
// ...
} else {
// disable tray option in your application or
// perform other actions
System.out.println("TryIcon geht hier nicht!");
}
}
}
Und wie kann ich nun machen dass das "Beenden" auch wirklich beendet?
import java.awt.*;
import java.awt.event.*;
public class Main {
public static void main(String[] args) {
TrayIcon trayIcon = null;
if (SystemTray.isSupported()) {
// get the SystemTray instance
SystemTray tray = SystemTray.getSystemTray();
// load an image
Image image = Toolkit.getDefaultToolkit().getImage("bin/tryi.gif");
// create a action listener to listen for default action executed on the tray icon
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0); // <<<<<<<<<<HIER WIRD BEENDET !!!!!!!!!!!!!!!
}
};
// create a popup menu
PopupMenu popup = new PopupMenu();
// create menu item for the default action
MenuItem defaultItem = new MenuItem("Beenden");
defaultItem.addActionListener(listener);
popup.add(defaultItem);
/// ... add other items
// construct a TrayIcon
trayIcon = new TrayIcon(image, "Tray Demo", popup);
// set the TrayIcon properties
trayIcon.addActionListener(listener);
// ...
// add the tray image
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(e);
}
// ...
} else {
// disable tray option in your application or
// perform other actions
System.out.println("TryIcon geht hier nicht!");
}
}
}
Ich hab's auch geschaft das er jetzt wirklich immer die Song Infos hinschreibt solange ich nicht über das TryIcon beende. Allerdings habe ich das nur hinbekommen indem ich das cookie.close(); entfernt habe. Aber das ist wohl nicht ganz sauber oder?
Ich müsste das wohl schliessen, wenn ich die Anwendung auch schliesse. Aber dort kennt er das "cookie.*" nicht.