1

我有一个带有 StyledDocument “doc”的 JTextPane,我希望doc.isertString(doc.getLength(), "http://www.google.com", attrs) JTextPane 显示一个可以单击的超链接。我以“http://www.google.com”和 attrs 为例,因为我真的不知道该怎么做。令人惊讶的是,我在网上找不到任何有用的东西(没有 html 或 HTMLDocument 等)。我不喜欢 swing 与 html 一起使用的方式,而且我不想使用它。

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

2 回答 2

4

定义您自己的AttributeSet以保留超链接信息。它应该包括例如蓝色和自定义属性。我们将其命名为“URL”。添加一些带有 的文本AttributeSetStyledDocument.

然后添加鼠标侦听器(运动和鼠标侦听器)。对于任何鼠标事件,您都可以使用它viewToModel()来获取指定鼠标位置的偏移量。获取偏移量的叶子元素(文本)并检查文本是否Element具有属性。

如果它执行了您的操作(例如,将鼠标光标设置为手或处理对 URL 的单击)。

于 2012-12-26T13:08:17.250 回答
4

+1 对 StanislavL 的回答。这是使用HTML 的简单方法。那么在你的java代码中使用HTML标签并不复杂。反过来可能很复杂。我做了一个简短的EG,易于执行和理解,你可以修改它并使其适合你的目的。

在此处输入图像描述

代码:

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) {

            }
         }
       });
    }
   }
于 2012-12-26T13:19:28.043 回答