IceFaces Button ActionListener

javama

Erfahrenes Mitglied
Hallo zusammen,
ich habe eine IceFacesbasierte-Webanwendung, ich habe einen Button eingefügt, und möchte dass wenn der Button angeklickt ist, eine Swing-Anwendung geöfnet wird (Swing-datei habe ich im projekt als Jar-Datei eingefügt).
wie kann ich das realisieren, dass die Jar-datei (GUI) durch Button-Anklick geöffnet wird!

was mache ich hier falsch, dass das GUI nicht geöffnet werden kann?
Java:
<ice:commandButton value="MyGui" 
                               actionListener="#{guiBean.showGui}">
 </ice:commandButton>

hat jemand eine Idee!

KANN MAN ÜBERHAUPT EINE SWING_ANWENDUNG INNERHALB EINER WEBANWENDUNG AUSFÜHREN.
WENN EIN BUTTON ANGEKLICKT WIRD, WIRD DANN DIE JAR_DATEI GEÖFFNET.
 
Zuletzt bearbeitet:

Thomas Darimont

Erfahrenes Mitglied
Hallo,

KANN MAN ÜBERHAUPT EINE SWING_ANWENDUNG INNERHALB EINER WEBANWENDUNG AUSFÜHREN.
WENN EIN BUTTON ANGEKLICKT WIRD, WIRD DANN DIE JAR_DATEI GEÖFFNET.
Ja, das ist möglich.

normalerweise macht man sowas mit Java Webstart:
http://docs.oracle.com/javase/tutorial/deployment/webstart/index.html

Am ende Klickt der Anwender auf einen Link in der Anwendung und dann wird die Java Anwendung heruntergeladen und ausgeführt.

Eine andere Möglichkeit (wenn die Anwendung nicht "sehr groß" ist) wäre ein (J)Applet, welches die Swing Anwendung startet.

Ich empfehle dir zwar die Java Webstart Variante, aber weil es gerade so schnell geht hier ein Beispiel für die Applet Variante:

Unsere mini SwingApp (in swingui.jar):
Java:
package de.tutorials;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

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

public class SimpleSwingApp extends JFrame{
	private static final long serialVersionUID = 1L;

	public SimpleSwingApp() {
		super("SimpleSwingApp");
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		//setDefaultCloseOperation(EXIT_ON_CLOSE);		
		JButton btn = new JButton("Welcher Tag ist heute?");
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(SimpleSwingApp.this, "Heute ist: " + new Date());
			}
		});
		add(btn);
		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new SimpleSwingApp();
	}

}

Unser Invoker - Applet (invoker_applet.jar)
Java:
package de.tutorials;

import java.lang.reflect.Method;

import javax.swing.JApplet;

public class InvokerApplet extends JApplet {
	@Override
	public void init() {
		System.out.println(getClass().getName() +" ready!");
		//invoke();
	}

	public void invoke() {
		String mainClassName =
					getParameter("main-class"); 
				//"de.tutorials.SimpleSwingApp"; 

		// TODO extract / process arguments
		
		Class<?> mainClass = loadMainClass(mainClassName);

		if (mainClass != null) {
			Method mainMethod = getMainMethod(mainClass);
			if (mainMethod != null) {
				try {
					mainMethod.invoke(null
							, new Object[]{null} // TODO handle arguments
					);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private Method getMainMethod(Class<?> mainClass) {
		try {
			Method method = mainClass.getDeclaredMethod("main",String[].class);
			return method;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	private Class<?> loadMainClass(String mainClassName) {
		try {
			Class<?> mainClass = getClass().getClassLoader().loadClass(mainClassName);
			return mainClass;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}

}

Unsere HTML Seite:
HTML:
<!DOCTYPE htm>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Run swing app from applet example</title>
</head>
<script type="text/javascript">
function runApp(){
	document.invokerApplet.invoke();
}
</script>
<body>

	<APPLET name="invokerApplet" archive="res/java/invoker_applet.jar,res/java/swingui.jar" code="de.tutorials.InvokerApplet" 
	height="0" width="0">
		<PARAM NAME="main-class" VALUE="de.tutorials.SimpleSwingApp">
	</APPLET>
	
	<a href="#" onclick="runApp()">Anwendung starten</a>
</body>
</html>

Die beiden .jar-Archive liegen relativ zur HTML-Seite im Verzeichnis res/java

Wenn das Applet fertig geladen wurde, kann man mit einem Klick auf "Anwendung starten" die Anwendung starten.

Die Swing Anwendung läuft dann in der Browser-Sandbox. Wenn du dort unsichere Operationen wie Datei -/ Datenbank- oder Netzwerk-Interaktionen ausführen möchtest musst du das Applet signieren. Durch signieren kannst du auch das gelbe Warn-Dreieck los werden...
Siehe auch:
http://www.tutorials.de/java/232026-textdateien-mit-applet-auslesen.html

Wenn du das Beispiel mit ICEFaces umsetzen möchtest könntest du die Java Script Funktion über einen h:commandButton bzw. einen h:commandLink mit dem onlick-Attribut realisieren.

Gruß Tom
 

Anhänge

  • invoker_applet.jar
    1,5 KB · Aufrufe: 12
  • swingui.jar
    1,7 KB · Aufrufe: 11

javama

Erfahrenes Mitglied
kannst du mir das erklären
Java:
Die beiden .jar-Archive liegen relativ zur HTML-Seite im Verzeichnis res/java

hat jemand eine Idee wo die jar-dateien hingehören!
 
Zuletzt bearbeitet: