JEditorPane + html -> java.io.IOException: invalid url

Ancodre

Mitglied
Hallo zusammen!

Ich komme irgendwie nicht weiter. Hab auch per Google gesucht, aber irgendwie finde ich meinen Fehler nicht.
Der Compiler gibt folgendes aus:

Code:
Failed to open resources/index.html
IOException: java.io.IOException: invalid url

Der Pfad zur HTML-Datei ist aber richtig, denke ich. Das Programm-Icon (b.gif) wird nämlich gezogen.
Hab mittlerweile etliche Male den Code abgeändert, aber jetzt sehe ich den Wald vor lauter Bäumen nicht mehr.

Hier mein Quelltext:
Java:
package testen;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*;
import java.awt.*;
import java.io.*;
import java.net.*;

public class JEditorPaneDemo extends JFrame
{
	private static final long	serialVersionUID	= 1299858177834171934L;
	JEditorPane								html;
	private Container					con;
	private JPanel						jpCenter;

	public static void main(String[] args)
	{
		new JEditorPaneDemo().setVisible(true);
	}

	public JEditorPaneDemo()
	{
		super("HtmlDemo");

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds((screenSize.width - this.getWidth()) / 2 - 400,
				(screenSize.height - this.getHeight()) / 2 - 400, 800, 800);

		Image programIcon = Toolkit.getDefaultToolkit().getImage("resources/b.gif");
		this.setIconImage(programIcon);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

		this.initComponents();
	}

	private void initComponents()
	{
		this.con = this.getContentPane();
		// this.con.add(this.getNorthPanel(), BorderLayout.NORTH);
		this.con.add(this.getCenterPanel(), BorderLayout.WEST);
		// this.con.add(this.getRightPanel(), BorderLayout.CENTER);
	}

	private JPanel getCenterPanel()
	{
		if (this.jpCenter == null)
		{
			this.jpCenter = new JPanel();
			this.jpCenter.setBackground(Color.BLUE);
			this.jpCenter.setPreferredSize(new Dimension(600, 764));

			try
			{
				URL url = null;
				String path = null;

				path = "resources/index.html";
				url = getClass().getResource(path);

				System.err.println("Failed to open " + path);
				// url = null;

				html = new JEditorPane(url);
				html.setEditable(false);
				html.addHyperlinkListener(createHyperLinkListener());
				html.setPage(url);
				JScrollPane scroller = new JScrollPane();
				JViewport vp = scroller.getViewport();
				vp.add(html);

				this.jpCenter.add(scroller, BorderLayout.CENTER);
			}
			catch (MalformedURLException e)
			{
				System.out.println("Malformed URL: " + e);
			}
			catch (IOException e)
			{
				System.out.println("IOException: " + e);
			}

		}

		return this.jpCenter;
	}

	public HyperlinkListener createHyperLinkListener()
	{
		return new HyperlinkListener()
		{
			public void hyperlinkUpdate(HyperlinkEvent e)
			{
				if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
				{
					if (e instanceof HTMLFrameHyperlinkEvent)
					{
						((HTMLDocument) html.getDocument())
								.processHTMLFrameHyperlinkEvent((HTMLFrameHyperlinkEvent) e);
					}
					else
					{
						try
						{
							html.setPage(e.getURL());
						}
						catch (IOException ioe)
						{
							System.out.println("IOE: " + ioe);
						}
					}
				}
			}
		};
	}

	void updateDragEnabled(boolean dragEnabled)
	{
		html.setDragEnabled(dragEnabled);
	}

}

Wäre nett, wenn mal jemand drüber schauen könnte.
Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Also ich denke mal der Fehler liegt in Zeile 59, schau doch mal nach, was da als Zuweisung für url ankommt.

Gruß Vanny
 
Hey, danke für Deine Mühe!
Du hast Recht.
Ich habe in Zeile 60
Code:
System.out.println(url);[code] eingefügt. Ich hoffe, das hast Du damit gemeint.
Der Compiler gibt jetzt [CODE]Failed to open resources/index.html
null
IOException: java.io.IOException: invalid url
aus. Verstehe ich nicht. Vor allem verstehe ich jetzt auch nicht, warum
Code:
null
nicht als erstes ausgegeben wird (OK, das ist im Moment auch nicht so wichtig).

Hab nochmal gegoogelt, bin aber zu keinem Ergebnis gekommen. Hab ich vielleicht was vergessen?
 
so gehts bei mir:

Java:
import java.io.IOException;
import java.net.URL;

import javax.swing.JEditorPane;
import javax.swing.JFrame;

public class HauptFenster extends JFrame{
	
	private JEditorPane html;
	
	public HauptFenster(){
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("Wo ist sie hin, die URL ?...");
		this.setSize((int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getWidth()*0.8), (int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getHeight()*0.8));
		this.setLocationRelativeTo(null);
		

			URL url = null;
			url = (getClass().getResource("/resources/index.html"));// man beachte einen Slash mehr ^^
			System.out.println(url);
			try {
				html = new JEditorPane(url);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		
		this.add(html);
		this.setVisible(true);
		
	}

}

und null wird nicht als erstes ausgegeben, weil schon die Zuweisung für den path nix ist ^^
"/" den haste vergessen, darum scheitert es.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Super Vanny, ich danke Dir!
Das mit dem Slash stimmt. Komischerweise wurde die HTML-Datei dann aber nur beim ersten Start gezogen. Bei jedem neuen Start, war nur so etwas, wie ein Platzhalter (so sieht es zumindest aus) zu sehen. Wenn ich was am Quelltext veränderte, funzte es wieder, aber nur beim ersten Start.
Ich habe jetzt Deine Version übernommen. Mein Quelltext sieht jetzt so aus:

Java:
package testen;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;

public class JEditorPaneDemo extends JFrame
{
	private static final long	serialVersionUID	= 1299858177834171934L;
	private JEditorPane				html;
	private Container					con;
	private JPanel					jpCenter;

	public static void main(String[] args)
	{
		new JEditorPaneDemo().setVisible(true);
	}

	public JEditorPaneDemo()
	{
		super("HtmlDemo");

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds((screenSize.width - this.getWidth()) / 2 - 400,
				(screenSize.height - this.getHeight()) / 2 - 400, 800, 800);

		Image programIcon = Toolkit.getDefaultToolkit().getImage("resources/b.gif");
		this.setIconImage(programIcon);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);

		this.initComponents();
	}

	private void initComponents()
	{
		this.con = this.getContentPane();
		// this.con.add(this.getNorthPanel(), BorderLayout.NORTH);
		this.con.add(this.getCenterPanel(), BorderLayout.WEST);
		// this.con.add(this.getRightPanel(), BorderLayout.CENTER);
	}

	private JPanel getCenterPanel()
	{
		if (this.jpCenter == null)
		{
			this.jpCenter = new JPanel();
			this.jpCenter.setBackground(Color.BLUE);
			this.jpCenter.setPreferredSize(new Dimension(600, 764));

			URL url = null;
			url = (getClass().getResource("/resources/index.html"));
			// System.out.println(url);
			try
			{
				this.html = new JEditorPane(url);
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}

			JScrollPane jscrpPane = new JScrollPane(this.html);
			jscrpPane.setPreferredSize(new Dimension(598, 760));

			this.jpCenter.add(jscrpPane);

		}

		return this.jpCenter;
	}

}

Eigenartiger Weise muss ich das Verzeichnis mit dem Programmicon woanders platzieren. Hab es im selben probiert (mit und ohne Slash), geht aber nicht (*lol*).
Das Verzeichnis mit der HTML-Datei liegt jetzt IM bin-Verzeichnis und das mit dem Icon NEBEN bin, src...

Naja, zumindest habe ich mein Ziel (HTML-Datei in einem JPanel darstellen) jetzt erreicht. Dank Deiner Hilfe!

Viele Grüße und danke
 

Zurück
Oben