Apa cara terbaik untuk menambahkan hyperlink di JLabel? Saya bisa mendapatkan tampilan menggunakan tag html, tetapi bagaimana cara membuka browser saat pengguna mengkliknya?
solusi sederhana yang dapat Anda temukan di sini: solusi
bench_doos
Jawaban:
97
Anda dapat melakukan ini dengan menggunakan a JLabel, tetapi alternatifnya adalah membuat gaya a JButton. Dengan begitu, Anda tidak perlu khawatir tentang aksesibilitas dan cukup mengaktifkan peristiwa menggunakan 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 */}}
+1 Bergantian gunakan a JTextFieldseperti yang ditunjukkan dalam jawaban ini .
Andrew Thompson
1
Bahkan teks yang bukan bagian dari link dapat diklik untuk mengikuti link tersebut.
neuralmer
28
Saya ingin menawarkan solusi lain. Ini mirip dengan yang sudah diusulkan karena menggunakan kode HTML dalam JLabel, dan mendaftarkan MouseListener di atasnya, tetapi juga menampilkan HandCursor saat Anda menggerakkan mouse ke atas tautan, sehingga tampilan & nuansanya persis seperti yang diharapkan sebagian besar pengguna . Jika penjelajahan tidak didukung oleh platform, tidak ada tautan HTML bergaris bawah biru yang dibuat yang dapat menyesatkan pengguna. Alih-alih, tautan hanya disajikan sebagai teks biasa. Ini dapat dikombinasikan dengan kelas SwingLink yang diusulkan oleh @ dimo414.
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 Sama-sama :) Sepertinya Anda tidak dapat mereproduksi perilaku pemblokiran Desktop.browse - di komputer saya yang lambat, ini pasti memblokir, terutama jika browser belum terbuka.
Stefan
poin yang bagus! menambahkan komentar Anda ke masalah ini - hampir cenderung ditutup karena tidak dapat diperbaiki, komentar Anda menyelamatkan saya :-)
kleopatra
Ini adalah solusi yang menarik. Saya suka cara memperluas JLabel - ini berarti GroupLayout lebih cenderung memposisikannya seperti label, bukan seperti tombol. Saya perhatikan bahwa menggunakan tombol tampaknya meningkatkan jarak yang Anda dapatkan antar komponen ...
Trejkaz
17
Saya menulis artikel tentang cara menyetel hyperlink atau mailto ke jLabel.
Jawaban @ McDowell bagus, tetapi ada beberapa hal yang dapat diperbaiki. Khususnya teks selain hyperlink dapat diklik dan masih terlihat seperti tombol meskipun beberapa gaya telah diubah / disembunyikan. Meskipun aksesibilitas itu penting, UI yang koheren juga penting.
Jadi saya menyusun kelas yang memperluas JLabel berdasarkan kode McDowell. Itu mandiri, menangani kesalahan dengan benar, dan terasa lebih seperti tautan:
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);}}}
Anda juga dapat, misalnya, mengubah warna tautan menjadi ungu setelah diklik, jika itu tampak berguna. Semuanya serba lengkap, Anda cukup menelepon:
SwingLink link =newSwingLink("Java","http://java.sun.com");
mainPanel.add(link);
Saya baru saja menambahkan permintaan tarik baru untuk menambahkan penyetel uri
boly38
Jika mouse menjadi tangan, itu akan menjadi lebih baik!
Leon
@Leon lihat versi yang ditautkan di bagian atas jawaban saya, ini menggunakan setCursor(new Cursor(Cursor.HAND_CURSOR));dan memiliki beberapa peningkatan lain atas varian sebaris dalam jawaban ini.
dimo414
14
Mungkin gunakan JXHyperlinkdari SwingX sebagai gantinya. Itu meluas JButton. Beberapa tautan berguna:
Anda dapat mencoba menggunakan JEditorPane sebagai ganti JLabel. Ini memahami HTML dasar dan akan mengirim acara HyperlinkEvent ke HyperlinkListener yang Anda daftarkan dengan JEditPane.
Ini adalah solusi terbaik jika Anda memiliki teks dengan beberapa hyperlink di dalamnya (mungkin diubah saat itu juga). Sebagian besar solusi lain memerlukan penempatan hyperlink dalam kontrol terpisah.
pengguna149408
5
Jika <a href="link"> tidak berfungsi, maka:
Buat JLabel dan tambahkan MouseListener (hiasi label agar terlihat seperti hyperlink)
Jawaban:
Anda dapat melakukan ini dengan menggunakan a
JLabel
, tetapi alternatifnya adalah membuat gaya aJButton
. Dengan begitu, Anda tidak perlu khawatir tentang aksesibilitas dan cukup mengaktifkan peristiwa menggunakanActionListener
.sumber
JTextField
seperti yang ditunjukkan dalam jawaban ini .Saya ingin menawarkan solusi lain. Ini mirip dengan yang sudah diusulkan karena menggunakan kode HTML dalam JLabel, dan mendaftarkan MouseListener di atasnya, tetapi juga menampilkan HandCursor saat Anda menggerakkan mouse ke atas tautan, sehingga tampilan & nuansanya persis seperti yang diharapkan sebagian besar pengguna . Jika penjelajahan tidak didukung oleh platform, tidak ada tautan HTML bergaris bawah biru yang dibuat yang dapat menyesatkan pengguna. Alih-alih, tautan hanya disajikan sebagai teks biasa. Ini dapat dikombinasikan dengan kelas SwingLink yang diusulkan oleh @ dimo414.
sumber
Saya menulis artikel tentang cara menyetel hyperlink atau mailto ke jLabel.
Jadi coba saja :
Saya pikir itulah yang Anda cari.
Berikut contoh kode lengkapnya:
sumber
Perbarui Saya telah merapikan
SwingLink
kelas lebih lanjut dan menambahkan lebih banyak fitur; salinan mutakhirnya dapat ditemukan di sini: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.javaJawaban @ McDowell bagus, tetapi ada beberapa hal yang dapat diperbaiki. Khususnya teks selain hyperlink dapat diklik dan masih terlihat seperti tombol meskipun beberapa gaya telah diubah / disembunyikan. Meskipun aksesibilitas itu penting, UI yang koheren juga penting.
Jadi saya menyusun kelas yang memperluas JLabel berdasarkan kode McDowell. Itu mandiri, menangani kesalahan dengan benar, dan terasa lebih seperti tautan:
Anda juga dapat, misalnya, mengubah warna tautan menjadi ungu setelah diklik, jika itu tampak berguna. Semuanya serba lengkap, Anda cukup menelepon:
sumber
setCursor(new Cursor(Cursor.HAND_CURSOR));
dan memiliki beberapa peningkatan lain atas varian sebaris dalam jawaban ini.Mungkin gunakan
JXHyperlink
dari SwingX sebagai gantinya. Itu meluasJButton
. Beberapa tautan berguna:sumber
Anda dapat mencoba menggunakan JEditorPane sebagai ganti JLabel. Ini memahami HTML dasar dan akan mengirim acara HyperlinkEvent ke HyperlinkListener yang Anda daftarkan dengan JEditPane.
sumber
Jika <a href="link"> tidak berfungsi, maka:
Lihat java.awt.Desktop API untuk membuka tautan menggunakan browser default (API ini hanya tersedia dari Java6).
sumber
Saya tahu saya agak terlambat ke pesta, tetapi saya membuat sedikit metode yang mungkin dianggap keren / berguna bagi orang lain.
Ini akan memberi Anda JLabel yang berfungsi seperti tautan yang tepat.
Beraksi:
Jika Anda tidak ingin tooltip kirim saja null.
Semoga seseorang menemukan ini berguna! (Jika ya, beri tahu saya, saya akan senang mendengarnya.)
sumber
Gunakan
JEditorPane
dengan aHyperlinkListener
.sumber
Sederhananya
window.open(website url)
, ini bekerja setiap saat.sumber
Kode berikut perlu
JHyperLink
ditambahkan ke jalur build Anda.Perhatikan bahwa Anda dapat mengisi
JComponent
array dengan lebih banyakSwing
komponen.Hasil:
sumber
Anda dapat menggunakan ini di bawah
atau jika Anda ingin menggunakan Internet Explorer atau Firefox ganti
chrome
denganiexplore
ataufirefox
sumber