Website über Proxy in JEditorPane anzeigen

Moin zusammen,

wie kann ich eine Website in einem Java-Programm direkt anzeigen lasse (JEditorPane) und dabei über einen Proxy gehen will?

Code, den ich bis jetzt habe:

public GUI(URL url)
	{
		displayDocument(url, "new Window");
	}
	
	private void displayDocument(URL url, String target)
	{
		try
		{
			if(url != null)
			{
				html = new JEditorPane(url);
				html.setEditable(false);
				html.addHyperlinkListener(createHyperlinkListener());
				JScrollPane scroller = new JScrollPane();
				JViewport vp = scroller.getViewport();
				vp.add(html);
				frame.setTitle("Exploring " + url.toString());
				frame.getContentPane().add(scroller, BorderLayout.CENTER);
			}
		}
		catch (MalformedURLException ex)
		{
			JOptionPane.showMessageDialog(null, url.toString() + " is not a valid URL");
		}
		catch (Exception ex)
		{
			JOptionPane.showMessageDialog(null, "Error occured while opening " + url.toString());
			return;
		}
	}
	
	private 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 ex)
						{
							System.out.println("Ex: " + ex);
						}
					}
				}
			}
		};
	}

Jetzt fehlt mir der Teil mit dem Proxy, bitte um Anregungen :slight_smile:

Hm, viel Möglichkeiten, in den Verbindungsaufbau einzugreifen, hat man beim JEditorPane ja nicht. Ich würde darum die Proxy-Settings JVM-weit setzen. Das geht über sog. Systemproperties. Diese gibst Du entweder beim Start der JVM als -D-Parameter mit (z.B. -Dhttp.proxyHost= -Dhttp.proxyPort=) oder setzst sie innerhalb des Programms mit System.setProperty.
System.setProperty("http.proxyHost", "<proxyHost>" );
Etwas komplexer wird’s, wenn Du noch Authentifizierung am Proxy machen musst. Mit den o.g. angaben solltest Du in der Lage sein, das über Google rauszufinden. Bei eventuellen Problemen kannst du ja hier posten.

Habe das jetzt über System.setProperty versucht zu lösen. Habe dort auch eine Lösungsmöglichkeit für Authentifizierung gefunden. Kann das ganze aber im Moment nicht wirklich testen, da der Debugger bei

html = new JEditorPane(url);

hängen bleibt und dann gehts nicht weiter, also er schmeißt mir keine Exception und nix, egal, wie lange ich warte.

Jemand ne Idee, wos hier hängen könnte?

vielleicht hilft ein Debug-Programm wie
[spoiler]```
public class Test2 {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JButton b = new JButton(“Test”);
frame.add(b);
frame.setVisible(true);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sleep(300000);
}
});
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
sleep(4000);
System.out.println("-------------");
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
for (Thread t : map.keySet()) {
System.out.println(“t: " + t);
for (StackTraceElement e : map.get(t))
System.out.println(” " + e.getClassName() + ", " + e.getMethodName());
}

                }
            }
        };
    new Thread(r).start();
}

static void sleep(int k)  {
    try  {
        Thread.sleep(k);
    }   catch (Exception e)   {
        throw new RuntimeException(e);
    }
}

}

(falls nicht extern High-Level-Tools für solche Aufgaben)

da läuft ein Thread, der alle 4 sec von allen laufenden Threads im Programm grob den StackTrace ausgibt, die aktuelle Klasse und Methode,
im Testprogramm um einen blockierenden Listener eines Buttons zu finden, wenn man den klickt,

bei dir vielleicht noch früher nötig wenn erst GUI-Zusammenbau, blockiert ist dann evtl. der main-Thread,
erst den Debug-Thread starten, dann mit GUI-Bau beginnen

Es muss auf jeden Fall mit den Proxy-Einstellungen zu tun haben, da es daheim ohne Proxy funktioniert, nur hinter dem Firmenproxy nicht

Habe mir den Quellcode von JEditorPane angeschaut. Intern wird (wie erwartet) eine URLConnection/HttpUrlConnection aufgemacht also keine Besonderheiten. Ich würde auf Fehler bei der Verwendung des Firmenproxies durch Dein Java-Programm tippen. Das kann mannigfaltige Ursachen haben, von einer Host-Firewall, die Java-Programmen den Verbindungsaufbau verbietet, über Fehler bei der Authentifizierung usw. Das ist aus der Ferne nicht gut zu diagnostizieren. Hier darum nur der Rat, selber weiter zu suchen. Z.B. den Debugger mit Step-Into zu verwenden und auch mal die Aufrufe innerhalb des JEditorPane zu tracken. Damit siehst Du exakt die Stelle, die nicht funktioniert (Motto: Keine Angst vor dem Quellcode des JDK!). Ansonsten parallel mal Wireshark anschmeißen und schauen, was (und ob überhaupt) von Deinem Rechner wirklich an den Proxy gesendet wird.