Avatar billede simonvalter Praktikant
27. maj 2005 - 14:29 Der er 6 kommentarer og
1 løsning

link i swing

Jeg leder efter en smart måde at få vist et clickable link i en swing applikation hvor tekst encoding er cp437

jeg har ikke mulighed for at indsætte en label eller lign.. teksten skal stå som den bliver indlæst.

Jeg har kigget på jeditorpane. problemet med HTMLEditorKit er at det ikke bevarer den encoding jeg indlæser med... og det er kun url som jeg vil have renderet.

Findes der andre komponenter der er smartere eller skal jeg ud og lave mit eget editorkit.. og har i evt en ide til hvordan jeg kommer igang med det?
Avatar billede arne_v Ekspert
27. maj 2005 - 22:30 #1
prøv eventuelt lige at forklare lidt mere - jeg forstår det ihvertfald ikke
Avatar billede simonvalter Praktikant
27. maj 2005 - 22:32 #2
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);
    }


--------------------------------------------------------
Avatar billede simonvalter Praktikant
27. maj 2005 - 22:34 #3
resultatet blev ihvertfald ren tekst med hyperlinks.. det tog også kun en halv dag ;)
Avatar billede simonvalter Praktikant
27. maj 2005 - 22:58 #4
Avatar billede simonvalter Praktikant
27. maj 2005 - 22:59 #5
input er iøvrigt

    ÛÛÛ                                                                   
    Û²ÛÛ                                                                 
ÜÜÛÛÛÛ²°Û  ÜÜÛÛÛÛÜÜ  ÜÛÛÛ  ÛÛÛÝ ÜÛÛÛÛÛÛÜÜ                                 
ÞÛ²ÛÝÞÛ²°Û ÞÛ²ÛÝÞÛ²ÛÝ Û°²Û  Û²ÛÛ ÛÛ²Û ÞÛ°ÛÝ                               
Û°²Û  Û²±Û Û°²Û  Û²°Û Û°²Û  Û²°Û Û°²Û  Û°ÛÛ                               
Û±²Û  Û²°Û Û±²Û  Û²±Û Û±²Û  Û²±Û Û±²Û  Û±²Û      ÛÛÛÛ  ÜÜÛÛÛÛÜÜ  ÜÛÛÛ  ÛÛÛÛ
Û°²Û  Û²°Û Û°²Û  Û²°Û Û°²Û  Û²°Û Û°²Û  Û°²Û      ßÛ°Û ÞÛ²ÛÝÞÛ²ÛÝ Û°²Û  Û²°Û
Û²°Û  Û°²Û Û²°Û  Û°²Û Û²°Û  Û°²Û Û²°Û  Û°²Û  ÜÛÛÛÛÛÛ±Û Û°²Û  Û²°Û Û°²Û  Û²ÛÛ
Û²±Û  Û±²Û Þ²±Û  Û±²Û Û²±Û  Û±²Û Û²±Û  Û°²Û  Û²°ÛÝÞÛ°Û Û±²Û  Û²±Û Û±²Û ÜÛÛÛÝ
Û²°Û  Û°²ÛÜÛ²°Û  Û°²Û Û²°Û  Û°²Û Û²°Û  Û²°Û  Û²±Û Û±°Û Û°²Û  Û²°Û Û°²ÛÛÛßß 
ÞÛ°ÛÝÞÛ°ÛÛÛßÛ°ÛÝÞÛ°²ÛÜÛÛ°ÛÝ ÛÛÛÛ ÛÛÛÛ  Û²°Û  Û²°Û Û°°Û Û°²Û  Û²°Û Û°²Û ßÛÜÜ
ßßÛÛÛÛßß  ßßÛÛÛÛ°ÛÛÛÜßßÛÛÛÛß ßÛÛßÞÛ  Û²±Û  Û±²Û Û°²Û Û²°Û  Û°²Û Û²°Û  Û²ÛÝ
                ßßß                  Û²°Û  Û°ÛÛ Û²ÛÛ Û²±Û  Û±²Û Û²±Û  Û°ÛÛ
                                      ÞÛ°ÛÝÞÛ°ÛÝ Û²ÛÜÛÛ²°Û  Û°²Û Û²°Û  Û±²Û
                                        ßßÛÛÛÛßß  ÛÛÛÛßÛÛÛß  Û°²Û ÛÛ°Û  Û°²Û
                                                            ÞÛ²ÛÜÜÛÛÝ  Û°²Û
                                                              ßßÛßß    ÛÛ²Û
D O W N L I N K                                                      aOhßÛÛÛ

URL: http://www.google.com
URL: www.google.dk
URL:  http://google.dk

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Avatar billede simonvalter Praktikant
27. maj 2005 - 23:00 #6
lukker
Avatar billede simonvalter Praktikant
27. maj 2005 - 23:00 #7
ups
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester