JLabel, URL

0

Witam,

Chciałbym wykonać JLabel, w którym byłby widoczny 'link' - jakby HTML'owy (tekstowy, niebieski, z podkreśleniem i kursorem-łapką po najechaniu). Link ten ma otwierać plik .html znajdujący się w tym samym folderze co plik .java.

Próbowałem szukać przykładów, ale niestety żaden mi nie działał :/. Ktoś ma na to pomysł? Dzięki z góry. Pzdr.

0

Sprawdź:
label.setText("<html><a href="plik.html">Link</a></html>");

0

No właśnie to nie działa :/

Link ładnie się wyświetla, tylko że nie reaguje na kliknięcia. Plik się nie otwiera.

0

No, widziałem właśnie ten kod. Mam go nawet obecnie w programie. Link widać, wszystko ładnie. Tylko, że po kliknięciu nie otwiera się ta strona w przeglądarce. Jedynie na konsoli wypisuje się ten URL. Może trzeba w tej pętli jeszcze coś dopisać?

0

Bo ten kod nie wyświetla strony ;-P On nie ma prawa wyświetlać strony, gdyż jedynie pokazuje, jak używać JEditorPane. Do wyświetlania strony użyj klasy Desktop.

0

Hehe :)

A możesz dokładnie napisać polecenie otwierające mi plik "pomoc.html" po kliknięciu na ten link? :) Dzięki z góry..

0

Desktop.getDesktop().browse(URI);

0

Nie chce mi się skompilować... Daję

<java>import java.awt.*;</java>

I przy próbie kompilacji wyświetla mi "cannot find symbol". Czy trzeba zaimportować jeszcze coś innego?

0

Czy może to być przez to, że korzystam z jdk1.5.0_06? Potrzeba do skompilowania tej klasy nowszego środowiska?

0

Ok, zainstalowałem jdk1.6 i doszedłem do etapu, w którym kompilator krzyczy 'cannot find class' w odniesieniu do URI. Nie rozumiem tego zupełnie, bo na początku programu zaimportowałem 'import java.net.URI.*;'.

Czy ktoś wie o co chodzi?

PS. Proszę o jakieś scalenie postów, bo sam już nie mogę tego zrobić..

0
import java.awt.Cursor;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;

import java.net.URL;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Font;

import java.io.IOException;


public class URLLabel extends JLabel {
	private URL address = null;
	private Color hover = new Color(0x800000);
	private Color visited = new Color(0x550055);
	private Color foreground = new Color(0x000080);

	public URLLabel(String url) throws MalformedURLException {
		super();
		address = new URL(url);
		String bgcolor = "rgb("+getBackground().getRed()+","+getBackground().getGreen()+","+getBackground().getBlue()+")";
		this.setText("<html><body bgcolor=\""+bgcolor+"\"><u>"+url+"</u></body></html>");
		this.setCursor(new Cursor(Cursor.HAND_CURSOR));
		this.setForeground(foreground);

		this.addMouseListener(new URLLabelMouseListener());
	}

	public void setHoverColor(Color hover) {
		this.hover = hover;
	}
	public void setVisitedColor(Color visited) {
		this.visited = visited;
	}
	public void setForegroundColor(Color foreground) {
		this.foreground = foreground;
	}

	public Color getHoverColor() {
		return hover;
	}
	public Color getVisitedColor() {
		return visited;
	}

	private class URLLabelMouseListener implements MouseListener {
		public void mouseClicked(MouseEvent e) {
			try {
				showInBrowser(address);
				foreground = visited;
			}catch(IOException ex) {
			}
		}

		public void mouseEntered(MouseEvent e) {
			setForeground(hover);
		}

		public void mouseExited(MouseEvent e) {
			setForeground(foreground);
		}

		public void mousePressed(MouseEvent e) {}

		public void mouseReleased(MouseEvent e) {}
	}
	/*
	 *
	 */
	private void showInBrowser(URL url) throws IOException {
		if (Desktop.isDesktopSupported()) {
			Desktop desktop = Desktop.getDesktop();
			if (desktop.isSupported(Desktop.Action.BROWSE)) {
				try {
					desktop.browse(url.toURI());
				}catch(URISyntaxException e) {}

			}
		}
	}//koniec showInBrowser
}
0

Dzięki wielkie jacobus2k. Przy próbie dodania obiektu stworzonej przez Ciebie klasy kompilator wyrzuca nast. błąd:

unreported exception java.net.MalformedURLException; must be caught or declared to be thrown

Coś nie tak dodałem?

W międzyczasie doszedłem samemu do nast. rozwiązania, uzupełniając wcześniej rozważany program:

		JEditorPane wyswietl_pomoc = new JEditorPane("text/html", "<a href='http://url.com'>tytul</a>.");
		wyswietl_pomoc.setEditable(false);
		wyswietl_pomoc.setOpaque(false);
		wyswietl_pomoc.addHyperlinkListener(new HyperlinkListener() {
			public void hyperlinkUpdate(HyperlinkEvent hle) {
				if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) {
					System.out.println(hle.getURL());
					try{
						try{
							Desktop.getDesktop().browse(new URI("http://url.com"));
						} catch (URISyntaxException e){ }
					} catch (IOException ex){ }
					
				}
			}
		});

Ten kod bez zarzutu otwiera poprawne URL'e.
Jest jeszcze tylko jeden problem, funkcja nie chce otwierać pliku z dysku - znajdującego się w tym samym folderze co pliki. java i .class. Da się to jakoś obejść?

0

Mój kod wymaga obsługi wyjątku MalformedURLException, który jest wyrzucany dla nieprawidłowych adresów URL.

Musisz użyć try catch:

URLLabel lab = null;
try {
	lab = new URLLabel("http://www.google.com");
} catch (MalformedURLException e) {
	//nieprawidłowy adres
}
0

Faktycznie, teraz działa super.

Da się to jakoś zmodyfikować, żeby dało radę otworzyć plik "pomoc.html", który znajduje się w tym samym folderze co pliki .class i .java? Bo tak właściwie to o to, mi chodzi od początku..

0

new File("pomoc.html").toURI()

0
Crane napisał(a)

new File("pomoc.html").toURI()

exception java.net.URISyntaxException is never thrown in body of corresponding try statement

Takowy błąd przy kompilacji się pojawia przy wstawieniu tego do obu cytowanych w tym wątku kodów..

0

Ok, wystarczyło wyrzucić tylko try catch tamtego wyjątku. Jeszcze raz dzięki wielkie Panowie!

0

A co to takiego te <java></java>??

1 użytkowników online, w tym zalogowanych: 0, gości: 1