Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在可编辑的EditorPane上添加HyperlinkListener_Java_Swing_Hyperlink_Jeditorpane - Fatal编程技术网

Java 在可编辑的EditorPane上添加HyperlinkListener

Java 在可编辑的EditorPane上添加HyperlinkListener,java,swing,hyperlink,jeditorpane,Java,Swing,Hyperlink,Jeditorpane,如果editorPane设置为seteditabiled(true),则不会被激发 因此,我尝试使用FocusListener动态修改editable属性: JEditorPane editorPane; editorPane.addHyperlinkListener(...) public void createGui(){ SwingUtilities.invokeLater(()->{ JEditorPane editorPane=新的JEditorPane(); setContentT

如果
editorPane
设置为
seteditabiled(true)
,则不会被激发

因此,我尝试使用
FocusListener
动态修改
editable
属性:

JEditorPane editorPane;
editorPane.addHyperlinkListener(...)
public void createGui(){
SwingUtilities.invokeLater(()->{
JEditorPane editorPane=新的JEditorPane();
setContentType(“text/html”);
editorPane.setText(“”);
editorPane.setEditable(false);
addFocusListener(新FocusListener(){
@覆盖公共无效焦点(FocusEvent e){

editorPane.setEditable(true);//
HyperlinkListener
似乎依赖于
FocusListener
,因此无法绕过
setEditable(false)
条件

最笨拙但最简单的解决方法可能是放置
editorPane.setEditable(true)
进入它自己的线程并在它之前进行睡眠,这样
HyperlinkListener
就有足够的时间启动它的
HyperlinkUpdate
方法。我发现即使是100ms也不够,所以我将它设置为250ms。这意味着,在点击
编辑器面板时,你将无法在250ms内修改它的内容。这是不可能的良好的编程风格,但完全可用且易于理解。代码示例:

public void createGui() {
    SwingUtilities.invokeLater(() -> {
        JEditorPane editorPane = new JEditorPane();
        editorPane.setContentType("text/html");
        editorPane.setText("<a href='http://google.com'>click me!</a>");

        editorPane.setEditable(false);

        editorPane.addFocusListener(new FocusListener() {
            @Override public void focusGained(FocusEvent e) {
                editorPane.setEditable(true); // <-- EDITABLE WHILE FOCUSSED
            }
            @Override public void focusLost(FocusEvent e) {
                editorPane.setEditable(false); // <-- NON-EDITABLE WHILE NON-FOCUSSED
            }
        });

        editorPane.addHyperlinkListener(new HyperlinkListener() {
            @Override public void hyperlinkUpdate(HyperlinkEvent e) {
                System.out.println(e.getEventType().toString());
            }
        });

        JButton someOtherSwingElement = new JButton("click me to remove focus from editorPane");
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel jp = new JPanel(new GridLayout());
        jp.add(editorPane);
        jp.add(someOtherSwingElement);
        jf.add(jp);
        jf.pack();
        jf.setVisible(true);
    }
}

是Stanislav Lapitsky的另一种方法。尽管如此,它说

我们只需要调用setEditable(false)并调用super方法,然后恢复可编辑状态

因此,即使这也不是真正的“解决方案”,而是一种变通方法

我很高兴听到其他人对此的想法。

来自

import javax.swing.*;
导入javax.swing.event.HyperlinkEvent;
导入javax.swing.event.HyperlinkListener;
导入javax.swing.text.html.HTMLEditorKit;
导入java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.io.IOException;
公共级乌利地托邦{
公共静态字符串HTML=“\n”+
“\n”+
“单击编辑窗格中的链接
\n”+ // "" + "" + “\n”+ ""; 布尔值isNeedCursorChange=true; JTextPane edit=新建JTextPane(){ 公共void集合游标(游标游标){ 如果(是否需要光标或更改){ super.setCursor(cursor); } } }; 公共药物{ JFrame=newjframe(“单击可编辑窗格中的链接”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(编辑); MyHTMLEditorKit=新的MyHTMLEditorKit(); //HTMLEditorKit=新的HTMLEditorKit(); 编辑.setEditorKit(工具包); //edit.setEditable(false); edit.setText(HTML); edit.addHyperlinkListener(新的HTMLListener()); 框架。设置尺寸(500300); frame.setLocationRelativeTo(空); frame.setVisible(true); } 公共静态void main(字符串[]args)引发异常{ 新的URLEditorPane(); } 私有类HTMLListener实现HyperlinkListener{ 公共无效hyperlinkUpdate(HyperlinkEvent e){ 如果(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED){ 试一试{ edit.setPage(例如getURL()); }捕获(IOE1异常){ e1.printStackTrace(); } } } } 公共类MyHTMLEditorKit扩展了HTMLEditorKit{ MyLink控制器处理程序=新建MyLink控制器(); 公共void安装(c窗格){ MouseListener[]oldMouseListeners=c.getMouseListeners(); MouseMotionListener[]oldMouseMotionListeners=c.getMouseMotionListeners(); 超级安装(c); //下面的代码将删除原始添加的链接处理程序 //HTMLEditorKit for(MouseListener l:c.getMouseListeners()){ c、 移除MouseListener(l); } for(MouseListener l:旧MouseListener){ c、 addMouseListener(l); } for(MouseMotionListener l:c.getMouseMotionListeners()){ c、 removeMouseMotionListener(l); } for(MouseMotionListener l:oldMouseMotionListeners){ c、 addMouseMotionListener(l); } //添加链接处理程序,而不是删除链接处理程序 c、 addMouseListener(handler); c、 addMouseMotionListener(处理程序); } 公共类MyLinkController扩展了LinkController{ 公共无效mouseClicked(MouseEvent e){ JEditorPane编辑器=(JEditorPane)e.getSource(); if(editor.isEditable()&&SwingUtilities.isLeftMouseButton(e)){ 如果(如getClickCount()==2){ editor.setEditable(false); 超级鼠标点击(e); editor.setEditable(true); } } } public void mouseMoved(MouseEvent e){ JEditorPane编辑器=(JEditorPane)e.getSource(); if(editor.isEditable()){ isNeedCursorChange=false; editor.setEditable(false); isNeedCursorChange=true; 超级鼠标移动(e); isNeedCursorChange=false; editor.setEditable(true); isNeedCursorChange=true; } } } } }
editorPane.addFocusListener(new FocusListener() {
    @Override public void focusGained(FocusEvent e) {
        new Thread(() -> {
            try {
                Thread.sleep(250);
            } catch (InterruptedException e1) {}
            editorPane.setEditable(true);
        }).start();
    }
    @Override   public void focusLost(FocusEvent e) {
        editorPane.setEditable(false);
    }
});
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.html.HTMLEditorKit;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;

public class URLEditorPane {

    public static String HTML="<html>\n" +
            "<body>\n" +
            "Click on the link in the editale JEditorPane <br>\n" +
//            "<a href=\"http://java.sun.com\">\nlink</a>" +
            "<a href=\"file:///c:/temp/test.html\">\nlink</a>" +
            "</body>\n" +
            "</html>";  

    boolean isNeedCursorChange=true;
    JTextPane edit=new JTextPane() {
        public void setCursor(Cursor cursor) {
            if (isNeedCursorChange) {
                super.setCursor(cursor);
            }
        }
    };

    public URLEditorPane() {
        JFrame frame=new JFrame("Click on Links in editable JEditorPane");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(edit);
        MyHTMLEditorKit kit=new MyHTMLEditorKit();
//        HTMLEditorKit kit=new HTMLEditorKit();

        edit.setEditorKit(kit);
//        edit.setEditable(false);

        edit.setText(HTML);
        edit.addHyperlinkListener(new HTMLListener());
        frame.setSize(500,300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        new URLEditorPane();
    }

    private class HTMLListener implements HyperlinkListener {
      public void hyperlinkUpdate(HyperlinkEvent e) {
        if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
            try {
                edit.setPage(e.getURL());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
      }
    }

    public class MyHTMLEditorKit extends HTMLEditorKit {

        MyLinkController handler=new MyLinkController();
        public void install(JEditorPane c) {
            MouseListener[] oldMouseListeners=c.getMouseListeners();
            MouseMotionListener[] oldMouseMotionListeners=c.getMouseMotionListeners();
            super.install(c);
            //the following code removes link handler added by original
            //HTMLEditorKit

            for (MouseListener l: c.getMouseListeners()) {
                c.removeMouseListener(l);
            }
            for (MouseListener l: oldMouseListeners) {
                c.addMouseListener(l);
            }

            for (MouseMotionListener l: c.getMouseMotionListeners()) {
                c.removeMouseMotionListener(l);
            }
            for (MouseMotionListener l: oldMouseMotionListeners) {
                c.addMouseMotionListener(l);
            }

            //add out link handler instead of removed one
            c.addMouseListener(handler);
            c.addMouseMotionListener(handler);
        }

        public class MyLinkController extends LinkController {

            public void mouseClicked(MouseEvent e) {
                JEditorPane editor = (JEditorPane) e.getSource();

                if (editor.isEditable() && SwingUtilities.isLeftMouseButton(e)) {
                    if (e.getClickCount()==2) {
                        editor.setEditable(false);
                        super.mouseClicked(e);
                        editor.setEditable(true);
                    }
                }

            }
            public void mouseMoved(MouseEvent e) {
                JEditorPane editor = (JEditorPane) e.getSource();

                if (editor.isEditable()) {
                    isNeedCursorChange=false;
                    editor.setEditable(false);
                    isNeedCursorChange=true;
                    super.mouseMoved(e);
                    isNeedCursorChange=false;
                    editor.setEditable(true);
                    isNeedCursorChange=true;
                }
            }

        }
    }
}