2012-12-26 106 views
1

我有一個帶有StyledDocument「doc」的JTextPane,當我想要JTextPane顯示一個可以單擊的超鏈接時。我把「http://www.google.com」和attrs作爲例子,因爲我真的不知道如何去做。令人驚訝的是,我找不到任何有用的信息(沒有html或HTMLDocument等)。我不喜歡swing如何處理html,我不喜歡使用它。如何將超鏈接添加到沒有html的JTextPane?

public class SSCCE extends JFrame { 

    private JPanel contentPane; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        SSCCE frame = new SSCCE(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
    public SSCCE() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 

     JTextPane textPane = new JTextPane(); 
     textPane.setEditable(false); 
     StyledDocument doc = textPane.getStyledDocument(); 
     SimpleAttributeSet attrs = new SimpleAttributeSet(); 
     try { 
      doc.insertString(doc.getLength(), "http://www.google.com", attrs); 
     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
     GroupLayout gl_contentPane = new GroupLayout(contentPane); 
     gl_contentPane.setHorizontalGroup(
      gl_contentPane.createParallelGroup(Alignment.LEADING) 
       .addGroup(gl_contentPane.createSequentialGroup() 
        .addComponent(textPane, GroupLayout.PREFERRED_SIZE, 422, GroupLayout.PREFERRED_SIZE) 
        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     gl_contentPane.setVerticalGroup(
      gl_contentPane.createParallelGroup(Alignment.LEADING) 
       .addGroup(gl_contentPane.createSequentialGroup() 
        .addComponent(textPane, GroupLayout.PREFERRED_SIZE, 248, GroupLayout.PREFERRED_SIZE) 
        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     contentPane.setLayout(gl_contentPane); 
    } 
} 

回答

4

定義您自己的AttributeSet以保持超鏈接信息。它應該包括例如藍色和自定義屬性。我們將其命名爲「URL」。將一些文字與AttributeSet添加到StyledDocument

然後添加一個鼠標監聽器(Motion和Mouse監聽器)。對於任何鼠標事件,您可以使用viewToModel()來獲得指定鼠標位置的偏移量。獲取偏移量的葉子元素(文本),並檢查文本Element是否具有屬性。

如果它執行了您的操作(例如將鼠標光標設置爲手動或處理,請單擊該URL)。

4

+1 to StanislavL answer.Here is simple approach using HTML。 好吧,在你的java代碼中使用HTML標籤並不複雜。其他方式可能很複雜。我做了一個簡短的EG,易於執行和理解,你可以修改它並使其適合你的目的。

enter image description here

CODE:

import java.awt.Cursor; 
import java.awt.Desktop; 
import java.awt.EventQueue; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.IOException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class JlabelLink extends JFrame { 
private JPanel pan; 

    private JLabel website; 

public JlabelLink() { 
    this.setTitle("jLabelLinkExample"); 
    this.setSize(300, 100); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setLocationRelativeTo(null); 

    pan = new JPanel(); 

    website = new JLabel(); 


    website.setText("<html> Website : <a href=\"\">http://www.google.com/</a></html>"); 
    website.setCursor(new Cursor(Cursor.HAND_CURSOR)); 


    pan.add(website); 
    this.setContentPane(pan); 
    this.setVisible(true); 

    goWebsite(website); 
} 


    public static void main(String args[]) { 

    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      new JlabelLink().setVisible(true); 
     } 
    }); 
    } 

    private void goWebsite(JLabel website) { 
    website.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      try { 
       try { 
        Desktop.getDesktop().browse(new URI("http://www.google.com/webhp?nomo=1&hl=fr")); 
       } catch (IOException ex) { 
        Logger.getLogger(JlabelLink.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
      catch (URISyntaxException ex) { 

      } 
     } 
     }); 
    } 
    }