Terminwecker

Hallo Zusammen!
Als absoluter Java Laie habe ich aus einem Stackoverflow Code übernommen und versucht, leicht abzuwandeln, um ein Popup für einen Terminwecker zu bauen:

<!DOCTYPE html>

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
		<title>Test Terminwecker Java Applet</title>
		<applet width="1" height="1" code="terminwecker.class" codebase="../java">
			<param name="Text" value="Erinnerung an Kaffee kochen!">
		</applet>
	</head>

	<body>
	</body>
</html>

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class CreateDialogFromOptionPane {
	public static void main(final String[] args) {
		final JFrame parent = new JFrame();
		JButton button = new JButton();
		button.setText("Click me to show dialog!");
		parent.add(button);
		parent.pack();
		parent.setVisible(true);
		button.addActionListener(new java.awt.event.ActionListener() {
			@Override
			String text = String.valueOf(getParameter("Text"));
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				String name = JOptionPane.showInputDialog(parent,text,null);
			}
		});
	}
}```
Leider scheitert schon die Compilierung:

> terminwecker.java:7: error: class CreateDialogFromOptionPane is public, should be declared in a file named CreateDialogFromOptionPane.java
> public class CreateDialogFromOptionPane {
> ^
> terminwecker.java:17: error: cannot find symbol
> String text = String.valueOf(getParameter("Text"));
> ^
> symbol: method getParameter(String)
> terminwecker.java:16: error: annotation type not applicable to this kind of declaration
> @Override
> ^
> 3 errors

Ich bitte um Hilfe, was hier falsch ist. Vielen Dank

terminwecker.java:7: error: class CreateDialogFromOptionPane is public, should be declared in a file named CreateDialogFromOptionPane.java

Nahe zu 1 zu 1 aus Google Translate

terminwecker.java: 7: Fehler: Klasse CreateDialogFromOptionPane ist Öffentlichkeit, sie sollten daher in einer Datei namens CreateDialogFromOptionPane.java deklariert werden.

Also der Dateiname heißt nicht terminwecker.java, sonder CreateDialogFromOptionPane.

Zudem erstellst du damit eine Java Anwendung mit main-Methode. Das HTML lässt aber darauf schließen dass du ein Applet erstellen möchtest. Dies funktioniert ein wenig anders.

Schau einfach mal nach einem kleinen Tutorial für Applets.

Ja, es soll ein Applet werden. Den ersten Fehler hab ich jetzt auch weg. Bleiben aber noch zwei:


import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JApplet;
import java.net.*;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class terminwecker {
	public static void main(final String[] args) {
		final JFrame parent = new JFrame();
		JButton button = new JButton();
		button.setText("Click me to show dialog!");
		parent.add(button);
		parent.pack();
		parent.setVisible(true);
		button.addActionListener(new java.awt.event.ActionListener() {
			@Override
			String text = String.valueOf(getParameter("Text"));
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				String name = JOptionPane.showInputDialog(parent,text,null);
			}
		});
	}
}```

> terminwecker.java:23: error: cannot find symbol
>                         String text = String.valueOf(getParameter("Text"));
>                                                      ^
>   symbol: method getParameter(String)
> terminwecker.java:22: error: annotation type not applicable to this kind of declaration
>                         @Override
>                         ^
> 2 errors

Ist der Code denn generell falsch (würde mich wundern, wenn auf Stackoverflow Code mit Syntaxfehlern gezeigt würde) oder hat es damit zu tun, dass es ein Applet werden soll?
Bin ich denn mit dem Compiler javac.exe überhaupt richtig? Auf http://www.d-mueller.de/blog/java-applet-tutorial/ habe ich ein Tut gefunden wo mit einem aufwendigen Editor gearbeitet wird. Brauche ich das für ein Applet zwingend oder reicht auch Notepad ++?

[quote=fischauge]Ist der Code denn generell falsch (würde mich wundern, wenn auf Stackoverflow Code mit Syntaxfehlern gezeigt würde) oder hat es damit zu tun, dass es ein Applet werden soll?[/quote]
Naja, wenn es ein Applet werden soll, auf jeden Fall. Dein Code ist für eine Applikation. (main()-Methode) Applet haben keine main()-Methode.
Ein Applet würde etwas anders aussehen:


public class Terminwecker extends JApplet {
   public void init() {
      String text = null;
      if(getParameter("Text") != null) {
         text = getParameter("Text");
      }
      JOptionPane.showMessageDialog(null, text, "Terminwecker", JOptionPane.INFORMATION_MESSAGE);
   }
}```

L-ectron-X, du bist auf jeden Fall mein Held des Tages!! Vielen Dank für die Hilfe.
Aktueller Code:

<!DOCTYPE html>

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
		<title>Test Terminwecker Java Applet</title>
	</head>

	<body>
		<div>Der Wecker wird in <span id="countdown"></span> Sekunden aktiv</div>
		<script>
			var sekunden = 10;
			var aktiv = setInterval(function() {
				if (--sekunden) {
					document.getElementById('countdown').innerHTML = sekunden;
				}
				else {
					if (aktiv) window.clearTimeout(aktiv);
					wecker_starten();
				}
			},1000);
			function wecker_starten() {
				var app = document.createElement('applet');
				app.width = 1;
				app.height = 1;
				app.code = 'terminwecker.class';
				app.codebase = '/develop';

				var par = document.createElement('param');
				par.name = 'Text';
				par.value = 'Erinnerung an Kaffee kochen!';
				app.appendChild(par);

				document.getElementsByTagName('head')[0].appendChild(app);
			}
		</script>
	</body>
</html>

public class terminwecker extends JApplet {
	public void init() {
		String text = null;
		if(getParameter("Text") != null) {
			text = getParameter("Text");
		}
		JOptionPane.showMessageDialog(null, text, "Terminwecker", JOptionPane.INFORMATION_MESSAGE);
	}
}```

Es compiliert und wird im Browser auch angezeigt.
**ABER**: Leider nur, wenn der Browser im Vordergrund liegt. Wenn stattdessen z.B. der Notepad ++ oben liegt geben Browser und Java nirgendwo einen Mucks von sich.
Getestet habe ich mit IE 11 auf Win 7 32Bit.
Ich hätte ja gern ein Popup, dass sich auf jeden Fall immer öffnet, egal welches Programm sich im Vordergrund befindet.
Gibt es dafür eine Lösung? Vielleicht ein anderes Kommando als **showMessageDialog()**?

Sobald das Applet nicht mehr sichtbar ist (z.b. durch runterscrollen oder wenn Browser in den Hintergrund kommt) wird das Applet gestoppt.
Siehe: http://docs.oracle.com/javase/tutorial/deployment/applet/lifeCycle.html oder http://stackoverflow.com/questions/14137470/when-is-applet-stop-called

So einen Terminwecker der im Hintergrund irgendwelche Dinge ausführen soll, ist als Applet vielleicht nicht optimal umgesetzt.

Das habe ich befürchtet. Danke für raussuchen, EikeB!
Hat denn jemand eine Idee, wie ich das realisieren könnte? Auf die Benutzer kann Einfluss genommen werden, die würden auch eine exe laden, wenn es nötig ist.

Stichwort: Java Web Start

Das stimmt nicht ganz. Es wird vom Browser die stop()-Methode aufgerufen, mehr nicht. Wenn da nichts drin steht (auch die Methode aus java.applet.Applet implementiert nichts) wird auch nichts gemacht. Ein Musikstück bspw. würde also bei verdecktem Browser-Fenster weiterspielen.
Das Problem ist vermtl. vielmehr, dass Applets keinen Einfluss auf Nicht-Java-GUI-Elemente, wie Fenster, Dialoge etc. haben. Und inwiefern Java-GUIs überhaupt System-GUIs überdecken dürfen weiß ich grad nicht.