jeg har klaret det .. men måske kan du se om det kan gøres smartere
Ok den var ikke så nem men det lykkedes
jeg fandt lidt kode som jeg kunne bygge videre på:
Et LinkEditorKit -- det skal extende ihvertfald StyledEditorKit da det har styled documents så jeg kan tilføje atributter
----------------------
class LinkEditorKit
extends DefaultEditorKit {
// attribute on inline elements; if value is URL, will be used for the HyperlinkEvent
public static final Object LINK = new StringBuffer("link");
// can be static because it picks up the editor from the MouseEvent
private static MouseListener linkHandler = new LinkHandler();
public LinkEditorKit() {
}
public void install(JEditorPane p) {
super.install(p);
p.addMouseListener(linkHandler);
}
public void deinstall(JEditorPane p) {
p.removeMouseListener(linkHandler);
super.deinstall(p);
}
private static class LinkHandler
extends MouseAdapter {
private Element activeElement;
private Element characterElementAt(MouseEvent e) {
JEditorPane p = (JEditorPane) e.getComponent();
Position.Bias[] bias = new Position.Bias[1];
int position = p.getUI().viewToModel(p, e.getPoint(), bias);
if (bias[0] == Position.Bias.Backward && position != 0)
--position;
Element c = ((StyledDocument) p.getDocument()).getCharacterElement(position);
// should test whether really inside
return c;
}
public void mousePressed(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e))
return;
JEditorPane p = (JEditorPane) e.getComponent();
if (p.isEditable())
return;
Element c = characterElementAt(e);
if (c != null && c.getAttributes().getAttribute(LINK) != null)
activeElement = c;
}
public void mouseReleased(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e) || activeElement == null)
return;
JEditorPane p = (JEditorPane) e.getComponent();
Element c = characterElementAt(e);
if (!p.isEditable() && c == activeElement) // too restrictive, should find attribute run
{
activeElement = null;
Object target = c.getAttributes().getAttribute(LINK);
if (!(target instanceof URL))
target = null;
p.fireHyperlinkUpdate(new HyperlinkEvent(p, HyperlinkEvent.EventType.ACTIVATED, (URL) target, null, c));
}
}
}
------------------------------------------------------------
LinkEditorKit skal retunere plain text (html,styled osv fucker up da layout ændrer sig i forhold til størrelse, de viser forkert tegnsæt og en masse andre problemer) så dette tilføjes..
----------------------------------------------------------------
public ViewFactory getViewFactory() {
return new HTMLFactoryX();
}
public static class HTMLFactoryX extends HTMLEditorKit.HTMLFactory
implements ViewFactory {
public View create(Element elem) {
return new WrappedPlainView(elem);
}
}
-----------------------------------------------------------------
Nu skal der bruges en Hyperlink listener
-------------------------------------------------------------
class URLListener implements HyperlinkListener {
public void hyperlinkUpdate(HyperlinkEvent event) {
JEditorPane pane = (JEditorPane) event.getSource();
HyperlinkEvent.EventType type = event.getEventType();
System.out.println("hyperlinkUpdate");
if (type == HyperlinkEvent.EventType.ENTERED) {
pane.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
System.out.println("type == HyperlinkEvent.EventType.ENTERED");
} else if (type == HyperlinkEvent.EventType.EXITED) {
pane.setCursor(Cursor.getDefaultCursor());
System.out.println("type == HyperlinkEvent.EventType.EXITED");
} else if (type == HyperlinkEvent.EventType.ACTIVATED) {
System.out.println("type == HyperlinkEvent.EventType.ACTIVATED: " + event.getURL());
}
}
}
---------------------------------------------------------------------------
Programmet der bruger det gør dette
----------------------------------------
JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
LinkEditorKit ds = new LinkEditorKit();
editorPane.setEditorKit(ds);
editorPane.addHyperlinkListener(new URLListener());
// indlæs data
InputStream inputStream = new FileInputStream("test.txt");
Reader r = new InputStreamReader(inputStream, "Cp437");
BufferedReader in = new BufferedReader(r);
// smid det i et eller andet .. jeditorpane, stringbuffer eller noget
Document doc = editorPane.getDocument();
int length = doc.getLength();
try {
doc.insertString(0, sb.toString(), null);
} catch (BadLocationException e) {
e.printStackTrace();
}
editorPane.setDocument(insertURL(doc));
-------------------------
replace tekst med hyperlink
-----------------
public static Document insertURL(Document doc) {
//define the pattern for url
String regex = "(?=http://|www.)\\S+";
//compile the pattern
Pattern pattern = Pattern.compile(regex);
try {
MutableAttributeSet a = new SimpleAttributeSet();
Matcher matcher = pattern.matcher(doc.getText(0, doc.getLength()));
//if the url was found, print it out here.
while (matcher.find()) {
// Get the url
String url = matcher.group();
// Find start index of url
int startIndex = matcher.start();
// Create hyperlink attribute
a.addAttribute(LinkEditorKit.LINK, new URL(generateUrl(url)));
// Remove the old url
doc.remove(startIndex, url.length());
// Insert the new url with hyperlink attribute
doc.insertString(startIndex, url, a);
}
} catch (BadLocationException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return doc;
}
/**
* Generates url in correct format.
*/
public static String generateUrl(String url) {
return (!url.startsWith("
http://") ? "
http://" + url : url);
}
--------------------------------------------------------