2011-04-08 3 views
5

JPanel에 하이퍼 링크를 추가하려고합니다. 텍스트 파란색으로 표시하고 링크를 선택해야합니다 (일부분 복사). 그래서 JLabel의 사용하려고 : 예, 그것은 다음과 같이 [지독한] 뭔가를 작성할 수 :Java에서 기본 Swing 구성 요소를 사용하여 선택 가능한 하이퍼 링크를 만들 수 있습니까?

someLabel.setText("<html><font color=\"#0000ff\"><u>http://example.com</u></font></html>"); 

그러나 불행하게도, JLabel의 어떤 텍스트를 선택하는 것을 허용하지 않습니다. 나는 또한 JTextField를 사용하려고 시도했지만 반대쪽에서는 HTML/CSS를 필드에 사용할 수 없습니다.

그래서 스윙 구성 요소 중 일부를 선택할 수있는 하이퍼 링크 (적절한 표시가있는)를 만들 수 있습니까? 아니면 제 3 자 구성 요소를 사용해야합니까? 고맙습니다.

답변

5

당신은 JEditorPane 비 편집에 HTML 콘텐츠를 표시 할 수 있습니다 참조 . 선택이 가능하며 링크를 통해 기능을 만들 수 있습니다. HyperlinkListener :

JEditorPane content = new JEditorPane(); 
    content.setContentType("text/html"); 
    content.setEditable(false); 
    content.setText("<html><a href=\"http://stackoverflow.com\">Link</a></html>")); 
    content.addHyperlinkListener(new HyperlinkListener() { 
     @Override 
     public void hyperlinkUpdate(HyperlinkEvent e) { 
      if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { 
       try { 
        Desktop.getDesktop().browse(e.getURL().toURI()); 
       } catch (Exception e1) { 
        Logger.getLogger(getClass()).error(
          "Error opening link " + e.getURL(), e1); 
       } 
      } 
     } 
    }); 
0

는 사용자 지정 Jlabel [Jlabel 확장]과 JLabel에 대한 MouseListener 쓰기를 만들어야합니다. 사용자가 JLabel 사용자 지정을 클릭하면 마우스 수신기가 링크로 사용자를 안내하는 작업을 수행해야합니다. 마우스 이벤트 [기본적으로 리디렉션 코드를 작성해야하는 MouseListener 인터페이스의 메서드]는 찾고있는 mouseClicked입니다. 여기

+0

'sfrj'에 대한 내 의견보기 –

+0

내 솔루션이 올바르지 않습니까? 나는 여러 부분에서이 컴포넌트를 사용할 것이라는 관점에서 사용자 정의 컴포넌트를 생성하는 위의 솔루션을 제공했다. 별도의 구성 요소로 클래스의 코드를 사용하면 코드를 재사용 할 수 있습니다. –

+0

그 의견은 '집중할 수있는'것과 관련이없는 것 같습니다. (아니, 귀하의 솔루션은 '올바른',하지만 조금 조정할 것이 더 좋을 것입니다.) –

1

하이퍼 링크와의 JLabel을 만드는 방법, 당신은 당신의 인 JPanel에 추가 할 수 있습니다 :

public HyperLinkLabel() 
{ 
JPanel p = new JPanel(); 
final String strURL = "http://www.yahoo.com"; 
final JLabel label = new JLabel("<html><a href=\" " + strURL + "\"> click </a></html>"); 

final JEditorPane htmlPane = new JEditorPane(); 


p.add(label); 

getContentPane().add(BorderLayout.NORTH, p); 
getContentPane().add(BorderLayout.CENTER, new JScrollPane(htmlPane)); 
setBounds(20,200, 500,500); 

label.addMouseListener(new MouseAdapter() { 
    public void mouseEntered(MouseEvent me) { 
     label.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
    } 
    public void mouseExited(MouseEvent me) { 
     label.setCursor(Cursor.getDefaultCursor()); 
    } 
    public void mouseClicked(MouseEvent me) 
    { 
     System.out.println("Clicked on Label..."); 
     try { 
      htmlPane.setPage(new URL(strURL)); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
     } 
    } 
    }); 
+2

예를 들어, 문제는 그게 키보드 focusable 수 없다는 것입니다. 이러한 기능을 쉽게 추가 할 수 있습니다. 1)'JLabel'을 포커스 가능으로 설정합니다. 2) 포커스가 획득/손실되었을 때 텍스트의 색 (즉,'setForeground (Color)')을 변경하는'FocusListener'를 추가하십시오. 'Color'를 변경하는 것은'MouseListener'에서도 좋은 아이디어 일 것입니다. –

관련 문제