2012-10-17 4 views
2

내 프로그램의 JTextPane에서 하이퍼 링크의 오른쪽 클릭을 탐지하려고합니다. 온라인 상에서는 아무런 문제가 없습니다. 누군가 나를 도울 수 있습니까?JTextPane의 하이퍼 링크 오른쪽 클릭 처리

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); 
     } 
    } 
} 
+1

자바 명명 규칙을 배우고 그들에 충실하십시오 : 여기

작은 데모 코드입니다. – kleopatra

답변

7

사용을 기존의 마우스 수신기를 구현하기 위해이 http://java-sl.com/tip_links_in_editable.html를 사용할 수 있습니다. HyperlinkListener는 마우스 이동 및 왼쪽 클릭 만 전달합니다.

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

} 
+0

안녕하세요, 귀하의 솔루션이 훌륭하다고 생각합니다! Tyvm - Rooland – Confident

3

평소에 MouseListener을 추가하고 마우스 오른쪽 단추로 수신을 누릅니다. 클릭시 viewToModel()JEditorPane 메서드를 사용하여 문서에서 오프셋을 가져옵니다. 그런 다음 getCharacterElement() 메소드가 StyledDocument인지 여부를 확인하여 리프 요소를 가져옵니다. 그런 다음 리프가 하이퍼 링크인지 여부를 확인하십시오.

또는 당신은 당신의 자신의 LinkController