que parametro iniciar fuente están ejemplo desuso codigo applets java html swing jar jeditorpane

java - parametro - ¿Es posible/cómo incrustar y acceder a archivos HTML en un JAR?



la api de applet y appletviewer están en desuso (2)

Estoy algo bloqueado en este momento: escribí una aplicación de escritorio Java bastante compleja (¡ninguna aplicación Applet / Web!) que tiene su propio "Manual de usuario". Este manual consta de algunos archivos HTML y JPG. Este manual se muestra en el "Menú de Ayuda" dentro de mi aplicación usando un JEditorPane.

Hasta aquí todo bien. Esto funciona muy bien siempre que lance el programa con Eclipse. Tan pronto como creo la versión de implementación como un archivo ejecutable (que se ajusta a un archivo .exe con launch4j), el "visualizador" HTML no puede mostrar el manual del usuario (faltan las imágenes).

Entiendo por qué está sucediendo esto, pero no tengo idea de cómo solucionarlo o eludirlo.

Mi aplicación carga sus recursos (propiedades Archivos, Iconos, etc.) a través de getClass (). GetResource (). Ejemplos:

this.setIconImage(new ImageIcon(getClass().getResource("/images/dialog-question.png")).getImage()); stream = new BufferedInputStream(MABIUpdater.class.getResourceAsStream("/settings.properties"));

Como dije antes, esto funciona muy bien (iniciando la aplicación desde dentro de Eclipse O como un ejecutable envuelto o un archivo ejecutable).

Así que traté de acceder a mis "Manuales" HTML como este también:

File manual = new File(getClass().getResource("/manual/help.html").toURI()); jEditorPane.setPage(manual.toURI().toURL());

Esto realmente NO funciona. Al iniciar el programa a través de Eclipse, veo el Manual, pero faltan imágenes. Lanzándolo a través de jar / exe obtengo un marco vacío.

Entonces, ¿hay algún "truco" sobre cómo lograr esto? Supongo que un problema es la propia página HTML porque no puede acceder a las imágenes vinculadas dentro de ese contenedor. Aquí hay un ejemplo realmente pequeño: un archivo HTML que no funciona (imagen faltante):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html lang="de"> <head> <title>Manual</title> </head> <body> <h1>Example: </h1> <p>fubar</p> <img style="display: block; text-align: center;" src="../manual/img/Shot01.png" width="666" height="644" border="0" alt="Bildtext"> <p><a href=/"http://www.google.com//">blablubb</a></p> </body> </html>

Espero que mi problema sea claro y alguien tenga una idea;).

Editar: todos los archivos HTML necesarios y las imágenes están en el archivo JAR / classpath. (solo para aclarar esto)


Una vez que tiene el URI, lo está convirtiendo en un Archivo y luego de vuelta a un URI y luego a una URL. Es posible que tengas un mejor éxito al simplemente convertir el URI en una URL


File manual = new File(getClass().getResource("/manual/help.html").toURI());

Ahí es donde sale mal. Java no puede crear un objeto de File desde un recurso incrustado

Guárdelo como una URL y setPage(..) para setPage(..) .

En cuanto al problema más general.

El HTML de un archivo Jar que vincula recursos (por ejemplo, CSS o imágenes) por referencias relativas funcionará muy bien.

P.EJ

Este ejemplo carga HTML (que tiene una referencia relativa a una imagen) desde un Jar.

import javax.swing.*; import java.net.URL; class ShowHtml { public static void main(String[] args) { final String address = "jar:http://pscode.org/jh/hs/object.jar!/popup_contents.html"; SwingUtilities.invokeLater(new Runnable() { public void run() { try { URL url = new URL(address); JEditorPane jep = new JEditorPane(url); JFrame f = new JFrame("Show HTML in Jar"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JScrollPane(jep)); f.pack(); f.setSize(400,300); f.setLocationByPlatform(true); f.setVisible(true); } catch(Exception e) { e.printStackTrace(); } } }); } }

Captura de pantalla

HTML

El HTML que se está cargando.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <!-- * Copyright (C) 1997 Sun Microsystems, Inc * All rights reserved. * Notice of copyright on this source code * product does not indicate publication. * * RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by * the U.S. Government is subject to restrictions as set forth * in subparagraph (c)(1)(ii) of the Rights in Technical Data * and Computer Software Clause at DFARS 252.227-7013 (Oct. 1988) * and FAR 52.227-19 (c) (June 1987). * * Sun Microsystems, Inc., 2550 Garcia Avenue, * Mountain View, California 94043. * --> <HTML> <HEAD> <TITLE> Editing Project Attributes </TITLE> </HEAD> <BODY BGCOLOR="#ffffff"> <IMG SRC="images/popup_icon.gif" width="24" height="24"> <b>Popup Window</b> <p> Popup windows appear near the location from which they are activated. They are not contained in frames and thus cannot be resized or moved by the user. Popups are dismissed by clicking anywhere in the help viewer. <p> Popup windows can be activated by clicking on a text object, graphic object, or JComponent button. All three examples are included in this demo. <p> <A HREF="popup_contents2.html">More...</A> </body> </html>

EG 2

Para HTML creado dinámicamente, el JRE probablemente usará la ubicación del archivo de clase como la ubicación supuesta del HTML. Pero para eliminar toda duda, podemos especificar el elemento base en el head .

import javax.swing.*; class HtmlUsingBase { public static void main(String[] args) { final String htmlContent = "<html>" + "<head>" + "<base href=''http://www.gravatar.com/''>" + "</head>" + "<body>" + "<h1>Image path from BASE</h1>" + "<img src=''avatar/a1ab0af4997654345d7a9" + "49877f8037e?s=128&d=identicon&r=PG''" + " width=''128'' height=''128''>" + "</body>" + "</html>"; SwingUtilities.invokeLater(new Runnable() { public void run() { JLabel label = new JLabel(htmlContent); JOptionPane.showMessageDialog(null, label); } }); } }

Captura de pantalla