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;
}
}
}
}
}