Was ist der beste Weg, um einen Hyperlink in ein JLabel einzufügen? Ich kann die Ansicht mithilfe von HTML-Tags abrufen, aber wie kann ich den Browser öffnen, wenn der Benutzer darauf klickt?
Sie können dies mit a tun JLabel, aber eine Alternative wäre, a zu stylen JButton. Auf diese Weise müssen Sie sich keine Sorgen um die Barrierefreiheit machen und können Ereignisse einfach mit einem auslösen ActionListener.
publicstaticvoid main(String[] args)throwsURISyntaxException{final URI uri =new URI("http://java.sun.com");classOpenUrlActionimplementsActionListener{@Overridepublicvoid actionPerformed(ActionEvent e){
open(uri);}}JFrame frame =newJFrame("Links");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100,400);Container container = frame.getContentPane();
container.setLayout(newGridBagLayout());JButton button =newJButton();
button.setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>"+" to go to the Java website.</HTML>");
button.setHorizontalAlignment(SwingConstants.LEFT);
button.setBorderPainted(false);
button.setOpaque(false);
button.setBackground(Color.WHITE);
button.setToolTipText(uri.toString());
button.addActionListener(newOpenUrlAction());
container.add(button);
frame.setVisible(true);}privatestaticvoid open(URI uri){if(Desktop.isDesktopSupported()){try{Desktop.getDesktop().browse(uri);}catch(IOException e){/* TODO: error handling */}}else{/* TODO: error handling */}}
Sogar Text, der nicht Teil des Links ist, kann angeklickt werden, um dem Link zu folgen.
Neuralmer
28
Ich möchte noch eine andere Lösung anbieten. Es ähnelt den bereits vorgeschlagenen, da es HTML-Code in einem JLabel verwendet und einen MouseListener darauf registriert, aber es zeigt auch einen HandCursor an, wenn Sie die Maus über den Link bewegen, sodass das Erscheinungsbild genau dem entspricht, was die meisten Benutzer erwarten würden . Wenn das Surfen von der Plattform nicht unterstützt wird, wird kein blauer, unterstrichener HTML-Link erstellt, der den Benutzer irreführen könnte. Stattdessen wird der Link nur als einfacher Text dargestellt. Dies könnte mit der von @ dimo414 vorgeschlagenen SwingLink-Klasse kombiniert werden.
publicclassJLabelLinkextendsJFrame{privatestaticfinalString LABEL_TEXT ="For further information visit:";privatestaticfinalString A_VALID_LINK ="http://stackoverflow.com";privatestaticfinalString A_HREF ="<a href=\"";privatestaticfinalString HREF_CLOSED ="\">";privatestaticfinalString HREF_END ="</a>";privatestaticfinalString HTML ="<html>";privatestaticfinalString HTML_END ="</html>";publicJLabelLink(){
setTitle("HTML link via a JLabel");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);Container contentPane = getContentPane();
contentPane.setLayout(newFlowLayout(FlowLayout.LEFT));JLabel label =newJLabel(LABEL_TEXT);
contentPane.add(label);
label =newJLabel(A_VALID_LINK);
contentPane.add(label);if(isBrowsingSupported()){
makeLinkable(label,newLinkMouseListener());}
pack();}privatestaticvoid makeLinkable(JLabel c,MouseListener ml){assert ml !=null;
c.setText(htmlIfy(linkIfy(c.getText())));
c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
c.addMouseListener(ml);}privatestaticboolean isBrowsingSupported(){if(!Desktop.isDesktopSupported()){returnfalse;}boolean result =false;Desktop desktop = java.awt.Desktop.getDesktop();if(desktop.isSupported(Desktop.Action.BROWSE)){
result =true;}return result;}privatestaticclassLinkMouseListenerextendsMouseAdapter{@Overridepublicvoid mouseClicked(java.awt.event.MouseEvent evt){JLabel l =(JLabel) evt.getSource();try{
URI uri =new java.net.URI(JLabelLink.getPlainLink(l.getText()));(newLinkRunner(uri)).execute();}catch(URISyntaxException use){thrownewAssertionError(use +": "+ l.getText());//NOI18N}}}privatestaticclassLinkRunnerextendsSwingWorker<Void,Void>{privatefinal URI uri;privateLinkRunner(URI u){if(u ==null){thrownewNullPointerException();}
uri = u;}@OverrideprotectedVoid doInBackground()throwsException{Desktop desktop = java.awt.Desktop.getDesktop();
desktop.browse(uri);returnnull;}@Overrideprotectedvoid done(){try{
get();}catch(ExecutionException ee){
handleException(uri, ee);}catch(InterruptedException ie){
handleException(uri, ie);}}privatestaticvoid handleException(URI u,Exception e){JOptionPane.showMessageDialog(null,"Sorry, a problem occurred while trying to open this link in your system's standard browser.","A problem occured",JOptionPane.ERROR_MESSAGE);}}privatestaticString getPlainLink(String s){return s.substring(s.indexOf(A_HREF)+ A_HREF.length(), s.indexOf(HREF_CLOSED));}//WARNING//This method requires that s is a plain string that requires//no further escapingprivatestaticString linkIfy(String s){return A_HREF.concat(s).concat(HREF_CLOSED).concat(s).concat(HREF_END);}//WARNING//This method requires that s is a plain string that requires//no further escapingprivatestaticString htmlIfy(String s){return HTML.concat(s).concat(HTML_END);}/**
* @param args the command line arguments
*/publicstaticvoid main(String[] args){SwingUtilities.invokeLater(newRunnable(){@Overridepublicvoid run(){newJLabelLink().setVisible(true);}});}}
@kleopatra Gern geschehen :) Es scheint, dass Sie das Blockierungsverhalten von Desktop.browse nicht reproduzieren konnten - auf meinem langsamen Computer blockiert es mit Sicherheit, insbesondere wenn der Browser noch nicht geöffnet ist.
Stefan
guter Punkt! fügte Ihren Kommentar zu dem Problem hinzu - fast geschlossen, da nicht
behoben werden kann
Dies ist eine interessante Lösung. Mir gefällt, wie es JLabel erweitert - dies bedeutet, dass GroupLayout es eher wie ein Label und nicht wie eine Schaltfläche positioniert. Ich habe festgestellt, dass die Verwendung von Tasten den Abstand zwischen den Komponenten zu vergrößern scheint ...
Trejkaz
17
Ich habe einen Artikel darüber geschrieben, wie man einen Hyperlink oder ein Mailto auf einem jLabel setzt.
@ McDowell's Antwort ist großartig, aber es gibt einige Dinge, die verbessert werden könnten. Insbesondere anderer Text als der Hyperlink kann angeklickt werden und sieht immer noch wie eine Schaltfläche aus, obwohl ein Teil des Stils geändert / ausgeblendet wurde. Barrierefreiheit ist wichtig, aber auch eine kohärente Benutzeroberfläche.
Also habe ich eine Klasse zusammengestellt, die JLabel basierend auf McDowell's Code erweitert. Es ist in sich geschlossen, behandelt Fehler richtig und fühlt sich eher wie ein Link an:
publicclassSwingLinkextendsJLabel{privatestaticfinallong serialVersionUID =8273875024682878518L;privateString text;private URI uri;publicSwingLink(String text, URI uri){super();
setup(text,uri);}publicSwingLink(String text,String uri){super();
setup(text,URI.create(uri));}publicvoid setup(String t, URI u){
text = t;
uri = u;
setText(text);
setToolTipText(uri.toString());
addMouseListener(newMouseAdapter(){publicvoid mouseClicked(MouseEvent e){
open(uri);}publicvoid mouseEntered(MouseEvent e){
setText(text,false);}publicvoid mouseExited(MouseEvent e){
setText(text,true);}});}@Overridepublicvoid setText(String text){
setText(text,true);}publicvoid setText(String text,boolean ul){String link = ul ?"<u>"+text+"</u>": text;super.setText("<html><span style=\"color: #000099;\">"+
link+"</span></html>");this.text = text;}publicString getRawText(){return text;}privatestaticvoid open(URI uri){if(Desktop.isDesktopSupported()){Desktop desktop =Desktop.getDesktop();try{
desktop.browse(uri);}catch(IOException e){JOptionPane.showMessageDialog(null,"Failed to launch the link, your computer is likely misconfigured.","Cannot Launch Link",JOptionPane.WARNING_MESSAGE);}}else{JOptionPane.showMessageDialog(null,"Java is not able to launch links on your computer.","Cannot Launch Link",JOptionPane.WARNING_MESSAGE);}}}
Sie können beispielsweise auch die Linkfarbe nach dem Klicken in Lila ändern, wenn dies nützlich erscheint. Es ist alles in sich geschlossen, Sie nennen einfach:
SwingLink link =newSwingLink("Java","http://java.sun.com");
mainPanel.add(link);
Ich habe gerade eine neue Pull-Anfrage hinzugefügt, um Uri Setter hinzuzufügen
boly38
Wenn die Maus zur Hand wird, ist es noch besser!
Leon
@Leon werfen Sie einen Blick auf die Version, die oben in meiner Antwort verlinkt ist. Sie verwendet setCursor(new Cursor(Cursor.HAND_CURSOR));und hat einige andere Verbesserungen gegenüber der Variante inline in dieser Antwort.
dimo414
14
Vielleicht stattdessen JXHyperlinkvon SwingX verwenden. Es erstreckt sich JButton. Einige nützliche Links:
Sie können versuchen, ein JEditorPane anstelle eines JLabels zu verwenden. Dies versteht das grundlegende HTML und sendet ein HyperlinkEvent-Ereignis an den HyperlinkListener, den Sie beim JEditPane registrieren.
Dies ist die beste Lösung, wenn Sie Text mit einigen Hyperlinks enthalten (möglicherweise im laufenden Betrieb geändert). Bei den meisten anderen Lösungen muss der Hyperlink in einem separaten Steuerelement platziert werden.
user149408
5
Wenn <a href="link"> nicht funktioniert, dann:
Erstellen Sie ein JLabel und fügen Sie einen MouseListener hinzu (dekorieren Sie das Label so, dass es wie ein Hyperlink aussieht).
Antworten:
Sie können dies mit a tun
JLabel
, aber eine Alternative wäre, a zu stylenJButton
. Auf diese Weise müssen Sie sich keine Sorgen um die Barrierefreiheit machen und können Ereignisse einfach mit einem auslösenActionListener
.quelle
JTextField
wie in dieser Antwort gezeigt .Ich möchte noch eine andere Lösung anbieten. Es ähnelt den bereits vorgeschlagenen, da es HTML-Code in einem JLabel verwendet und einen MouseListener darauf registriert, aber es zeigt auch einen HandCursor an, wenn Sie die Maus über den Link bewegen, sodass das Erscheinungsbild genau dem entspricht, was die meisten Benutzer erwarten würden . Wenn das Surfen von der Plattform nicht unterstützt wird, wird kein blauer, unterstrichener HTML-Link erstellt, der den Benutzer irreführen könnte. Stattdessen wird der Link nur als einfacher Text dargestellt. Dies könnte mit der von @ dimo414 vorgeschlagenen SwingLink-Klasse kombiniert werden.
quelle
Ich habe einen Artikel darüber geschrieben, wie man einen Hyperlink oder ein Mailto auf einem jLabel setzt.
Probieren Sie es einfach aus :
Ich denke, genau das suchen Sie.
Hier ist das vollständige Codebeispiel:
quelle
Update Ich habe die
SwingLink
Klasse weiter aufgeräumt und weitere Funktionen hinzugefügt. Eine aktuelle Kopie finden Sie hier: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java@ McDowell's Antwort ist großartig, aber es gibt einige Dinge, die verbessert werden könnten. Insbesondere anderer Text als der Hyperlink kann angeklickt werden und sieht immer noch wie eine Schaltfläche aus, obwohl ein Teil des Stils geändert / ausgeblendet wurde. Barrierefreiheit ist wichtig, aber auch eine kohärente Benutzeroberfläche.
Also habe ich eine Klasse zusammengestellt, die JLabel basierend auf McDowell's Code erweitert. Es ist in sich geschlossen, behandelt Fehler richtig und fühlt sich eher wie ein Link an:
Sie können beispielsweise auch die Linkfarbe nach dem Klicken in Lila ändern, wenn dies nützlich erscheint. Es ist alles in sich geschlossen, Sie nennen einfach:
quelle
setCursor(new Cursor(Cursor.HAND_CURSOR));
und hat einige andere Verbesserungen gegenüber der Variante inline in dieser Antwort.Vielleicht stattdessen
JXHyperlink
von SwingX verwenden. Es erstreckt sichJButton
. Einige nützliche Links:quelle
Sie können versuchen, ein JEditorPane anstelle eines JLabels zu verwenden. Dies versteht das grundlegende HTML und sendet ein HyperlinkEvent-Ereignis an den HyperlinkListener, den Sie beim JEditPane registrieren.
quelle
Wenn <a href="link"> nicht funktioniert, dann:
Schauen Sie sich die java.awt.Desktop- API an, um einen Link mit dem Standardbrowser zu öffnen (diese API ist nur in Java6 verfügbar).
quelle
Ich weiß, dass ich etwas spät zur Party komme, aber ich habe eine kleine Methode entwickelt, die andere vielleicht cool / nützlich finden.
Sie erhalten ein JLabel, das sich wie ein richtiger Link verhält.
In Aktion:
Wenn Sie keinen Tooltip wünschen, senden Sie einfach eine Null.
Hoffe jemand findet das nützlich! (Wenn Sie dies tun, lassen Sie es mich wissen, ich würde mich freuen zu hören.)
quelle
Verwenden Sie a
JEditorPane
mit aHyperlinkListener
.quelle
Einfach gesagt
window.open(website url)
, es funktioniert jedes Mal.quelle
Der folgende Code muss
JHyperLink
Ihrem Erstellungspfad hinzugefügt werden.Beachten Sie, dass Sie das
JComponent
Array mit weiterenSwing
Komponenten füllen können .Ergebnis:
quelle
Sie können dies unter einem verwenden
oder wenn Sie Internet Explorer oder Firefox verwenden möchten, ersetzen Sie
chrome
durchiexplore
oderfirefox
quelle