处理超级链接右侧点击JTextPane中 [英] Handling hyperlink right clicks on a JTextPane

查看:129
本文介绍了处理超级链接右侧点击JTextPane中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图发现在我的程序JTextPane中的超链接上点击右键。真的有什么问题上联机。有人可以帮我吗?

 公共类rchltest扩展的Applet {    公共无效的init(){        的JPanel面板=新JPanel(假);        JEdi​​torPane中gentextp =新的JTextPane();
        JScrollPane的滚动窗格=新JScrollPane的(gentextp);
        panel.add(滚动窗格);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);
        gentextp.setContentType(text / html的);
        gentextp.setEditable(假);
        gentextp.addHyperlinkListener(新texthll());
        gentextp.set preferredSize(新尺寸(500,400));
        gentextp.setText(这是一个< A HREF =HTTP:// A'>超链接< / A>中);        this.add(面板);    }
}类texthll实现HyperlinkListener {        公共无效hyperlinkUpdate(HyperlinkEvent事件){
        如果(event.getEventType()== HyperlinkEvent.EventType.ACTIVATED){
            JEdi​​torPane的窗格=(JEditorPane)都event.getSource();            网址URL = event.getURL();                //显示在编辑器窗格中的新的一页。
                JOptionPane.showMessageDialog(NULL,URL);
        }
    }
}


解决方案

使用传统的鼠标侦听器。 HyperlinkListener只转发鼠标移动和左点击。

下面是一个小的演示code:

 进口java.awt.BorderLayout中;
进口的java.awt.Desktop;
进口java.awt.Dimension中;
进口java.awt.event.MouseAdapter;
进口java.awt.event.MouseEvent中;
进口java.io.IOException异常;
进口java.net.URI中;
进口java.net.URISyntaxException;进口javax.swing.JEditorPane中;
进口javax.swing.JFrame中;
进口javax.swing.JPanel中;
进口javax.swing.JScrollPane中;
进口javax.swing.JTextPane中;
进口javax.swing.SwingUtilities中;
进口javax.swing.UIManager中;
进口javax.swing.UnsupportedLookAndFeelException;
进口javax.swing.event.HyperlinkEvent;
进口javax.swing.event.HyperlinkListener;
进口javax.swing.text.AttributeSet;
进口javax.swing.text.Element;
进口javax.swing.text.html.HTML;
进口javax.swing.text.html.HTMLDocument中;公共类TestHyperlinks {    私人final类HyperlinkMouseListener扩展MouseAdapter {
        @覆盖
        公共无效的mouseClicked(的MouseEvent E){
            如果(e.getButton()== MouseEvent.BUTTON3){
                元h = getHyperlinkElement(E);
                如果(H!= NULL){
                    。对象属性= h.getAttributes()的getAttribute(HTML.Tag.A);
                    如果(属性的instanceof的AttributeSet){
                        AttributeSet中的设置=(AttributeSet中)属性;
                        字符串HREF =(字符串)set.getAttribute(HTML.Attribute.HREF);
                        如果(HREF!= NULL){
                            尝试{
                                。Desktop.getDesktop()浏览(新的URI(HREF));
                            }赶上(IOException异常E1){
                                e1.printStackTrace();
                            }赶上(E1的URISyntaxException){
                                e1.printStackTrace();
                            }
                        }
                    }
                }
            }
        }        私有元素getHyperlinkElement(事件的MouseEvent){
            JEdi​​torPane的编辑器=(JEditorPane)都event.getSource();
            INT POS = editor.getUI()viewToModel(主编,event.getPoint());
            如果(POS> = 0&放大器;&安培; editor.getDocument()的instanceof HTMLDocument的){
                HTMLDocument的hdoc =(HTMLDocument的)editor.getDocument();
                元素ELEM = hdoc.getCharacterElement(POS)
                如果(elem.getAttributes()的getAttribute(HTML.Tag.A)!= NULL){
                    返回ELEM;
                }
            }
            返回null;
        }
    }    保护无效initUI(){
        的JPanel面板=新JPanel(假);        JEdi​​torPane中gentextp =新的JTextPane();
        JScrollPane的滚动窗格=新JScrollPane的(gentextp);
        panel.add(滚动窗格);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);
        gentextp.setContentType(text / html的);
        gentextp.setEditable(假);
        gentextp.set preferredSize(新尺寸(500,400));
        gentextp.addMouseListener(新HyperlinkMouseListener());
        gentextp.setText(含有超链接的文字部分:其中; A HREF = \\的http://www.stackoverflow.com \\>到计算器的链接< / A>不可与一些文字以超链接);        JFrame的F =新的JFrame(TestHyperlinks.class.getSimpleName());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(面板,BorderLayout.CENTER);
        f.pack();
        f.setSize(f.getWidth()+ 100,f.getHeight()+ 100);
        f.setVisible(真);    }    公共静态无效的主要(字串[] args)抛出了ClassNotFoundException,InstantiationException,IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(Runnable的新(){            @覆盖
            公共无效的run(){
                新TestHyperlinks()initUI()。
            }
        });
    }}

I am trying to detect right clicks on hyperlinks in a JTextPane in my program. There really is nothing on the issue online. Can someone help me?

public class rchltest extends Applet {

    public void init() {

        JPanel panel = new JPanel(false);

        JEditorPane gentextp = new JTextPane();
        JScrollPane scrollPane = new JScrollPane(gentextp);
        panel.add(scrollPane);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        gentextp.setContentType("text/html");
        gentextp.setEditable(false);
        gentextp.addHyperlinkListener(new texthll());
        gentextp.setPreferredSize( new Dimension( 500, 400 ) );
        gentextp.setText("Here is a <a href='http://A'>hyperlink</a>");

        this.add( panel );

    }
}

class texthll implements HyperlinkListener  {

        public void hyperlinkUpdate(HyperlinkEvent event) {
        if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
            JEditorPane pane = (JEditorPane)event.getSource();

            URL url = event.getURL();

                // Show the new page in the editor pane.
                JOptionPane.showMessageDialog( null, url);
        }
    }
}

解决方案

Use a traditional mouse listener. HyperlinkListener forwards only mouse move and left-clicks.

Here is a small demo code:

import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;

public class TestHyperlinks {

    private final class HyperlinkMouseListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3) {
                Element h = getHyperlinkElement(e);
                if (h != null) {
                    Object attribute = h.getAttributes().getAttribute(HTML.Tag.A);
                    if (attribute instanceof AttributeSet) {
                        AttributeSet set = (AttributeSet) attribute;
                        String href = (String) set.getAttribute(HTML.Attribute.HREF);
                        if (href != null) {
                            try {
                                Desktop.getDesktop().browse(new URI(href));
                            } catch (IOException e1) {
                                e1.printStackTrace();
                            } catch (URISyntaxException e1) {
                                e1.printStackTrace();
                            }
                        }
                    }
                }
            }
        }

        private Element getHyperlinkElement(MouseEvent event) {
            JEditorPane editor = (JEditorPane) event.getSource();
            int pos = editor.getUI().viewToModel(editor, event.getPoint());
            if (pos >= 0 && editor.getDocument() instanceof HTMLDocument) {
                HTMLDocument hdoc = (HTMLDocument) editor.getDocument();
                Element elem = hdoc.getCharacterElement(pos);
                if (elem.getAttributes().getAttribute(HTML.Tag.A) != null) {
                    return elem;
                }
            }
            return null;
        }
    }

    protected void initUI() {
        JPanel panel = new JPanel(false);

        JEditorPane gentextp = new JTextPane();
        JScrollPane scrollPane = new JScrollPane(gentextp);
        panel.add(scrollPane);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        gentextp.setContentType("text/html");
        gentextp.setEditable(false);
        gentextp.setPreferredSize(new Dimension(500, 400));
        gentextp.addMouseListener(new HyperlinkMouseListener());
        gentextp.setText("Some text containing an hyperlink: <a href=\"http://www.stackoverflow.com\">a link to stackoverflow</a> and some more text not in an hyperlink");

        JFrame f = new JFrame(TestHyperlinks.class.getSimpleName());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(panel, BorderLayout.CENTER);
        f.pack();
        f.setSize(f.getWidth() + 100, f.getHeight() + 100);
        f.setVisible(true);

    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestHyperlinks().initUI();
            }
        });
    }

}

这篇关于处理超级链接右侧点击JTextPane中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆