• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Hyperlinkを、JLabel、JButton、JEditorPaneで表示
#navi(../)
RIGHT:Posted by [[terai]] at 2007-11-26
*Hyperlinkを、JLabel、JButton、JEditorPaneで表示 [#md067dd7]
Hyperlinkを、JLabel、JButton、JEditorPaneで表示し、それぞれクリックした時のイベントを取得します。
---
category: swing
folder: HyperlinkLabel
title: Hyperlinkを、JLabel、JButton、JEditorPaneで表示
tags: [Html, JLabel, JButton, JEditorPane, HyperlinkListener, Hyperlink]
author: aterai
pubdate: 2007-11-26T04:49:23+09:00
description: Hyperlinkを、JLabel、JButton、JEditorPaneで表示し、それぞれクリックした時のイベントを取得します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTOIQH0ABI/AAAAAAAAAb4/9QlzkW-7_Es/s800/HyperlinkLabel.png
---
* 概要 [#summary]
`Hyperlink`を、`JLabel`、`JButton`、`JEditorPane`で表示し、それぞれクリックした時のイベントを取得します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTOIQH0ABI/AAAAAAAAAb4/9QlzkW-7_Es/s800/HyperlinkLabel.png)

#screenshot

**サンプルコード [#f6c1e592]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
class URILabel extends JLabel {
  private final String href;
  public URILabel(String href) {
    super("<html><a href='"+href+"'>"+href+"</a>");
    super("<html><a href='" + href + "'>" + href + "</a>");
    this.href = href;
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {open(href);}
      @Override public void mousePressed(MouseEvent e) {
        open(href);
      }
    });
  }
}
}}

#code{{
// ...

JButton button = new JButton(a);
button.setUI(LinkViewButtonUI.createUI(button));

// ...

class LinkViewButtonUI extends BasicButtonUI {
  private final static LinkViewButtonUI linkViewButtonUI = new LinkViewButtonUI();
  public static ButtonUI createUI(JButton b) {
    b.setBorder(BorderFactory.createEmptyBorder(0,0,2,0));
    b.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
    b.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    return linkViewButtonUI;
  }
  private LinkViewButtonUI() {
    super();
  }
  private static Dimension size = new Dimension();
  private static Rectangle viewRect = new Rectangle();
  private static Rectangle iconRect = new Rectangle();
  private static Rectangle textRect = new Rectangle();
  @Override
  public synchronized void paint(Graphics g, JComponent c) {
  @Override public synchronized void paint(Graphics g, JComponent c) {
    AbstractButton b = (AbstractButton) c;
    ButtonModel model = b.getModel();
    Font f = c.getFont();
    g.setFont(f);
    FontMetrics fm = c.getFontMetrics(f);
    //...
}}
    // ...
  }
}

#code{{
JEditorPane editor = new JEditorPane("text/html", "<html><a href='"+MYSITE+"'>"+MYSITE+"</a>");
JEditorPane editor = new JEditorPane(
    "text/html", "<html><a href='" + MYSITE + "'>" + MYSITE + "</a>");
editor.setOpaque(false);
//editor.setBackground(getBackground());
//editor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
editor.setEditable(false); //REQUIRED
// editor.setBackground(getBackground());
// editor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
editor.setEditable(false); // REQUIRED
editor.addHyperlinkListener(new HyperlinkListener() {
  public void hyperlinkUpdate(HyperlinkEvent e) {
    if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
      java.awt.Toolkit.getDefaultToolkit().beep();
  @Override public void hyperlinkUpdate(HyperlinkEvent e) {
    if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
      Toolkit.getDefaultToolkit().beep();
    }
  }
});
}}

**解説 [#m595ce0a]
上記のサンプルでは、クリックされた時に、リンクをブラウザで開く([[Desktopでブラウザを起動>Swing/Desktop]])代わりに、beep音を鳴らしています。
* 解説 [#explanation]
- `JLabel` + `MouseListener`
-- `JLabel`に`MouseListener`を設定
-- リンクの表示には`<a>`タグを使用
- `JButton` + `ButtonUI`
-- `JButton`に文字の描画を変更する`ButtonUI`を設定
--- `Rollover`: アンダーライン
--- `Pressed`: 黒
- `JEditorPane` + `HyperlinkListener`
-- 編集不可にした`JEditorPane`に`HyperlinkListener`を設定
-- リンクの表示には`<a>`タグを使用
-- 文字列選択してコピーが可能

-JLabel+MouseListener
--JLabelにMouseListenerを設定しています。
--リンクの表示には<a>タグを使っています。
----
- %%このサンプルではクリックされた時に実行するイベントは`beep`音を鳴らすだけ%% リンクをブラウザで開く場合の処理は[[Desktopでブラウザを起動>Swing/Desktop]]などを参照

-JButton+ButtonUI
--JButtonに、文字の描画を変更するButtonUIを設定しています。
---Rollover: アンダーライン
---Pressed: 黒
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JEditorPane.html JEditorPane (Java Platform SE 8)]
- [http://www.jroller.com/santhosh/entry/link_buttons_in_swing Link Buttons in Swing - Santhosh Kumar's Weblog]
-- `JButton`+`MatteBorder`でリンクを表現するサンプルがある
- [[TransferHandlerでHyperlinkをブラウザにドロップ>Swing/DraggableLinkButton]]
- [[Htmlを使ったJLabelとJEditorPaneの無効化>Swing/DisabledHtmlLabel]]

-JEditorPane+HyperlinkListener
--編集不可にしたJEditorPaneにHyperlinkListenerを設定しています。
--リンクの表示には<a>タグを使っています。
--選択してコピーできます。

**参考リンク [#lb91dece]
-[[JEditorPane (Java Platform SE 6)>http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/JEditorPane.html]]
-[[Link Buttons in Swing - Santhosh Kumar's Weblog>http://www.jroller.com/santhosh/entry/link_buttons_in_swing]]
--こちらは、JButton+MatteBorderで表現しているようです。
-[[TransferHandlerでHyperlinkをブラウザにドロップ>Swing/DraggableLinkButton]]
-[[Htmlを使ったJLabelとJEditorPaneの無効化>Swing/DisabledHtmlLabel]]

**コメント [#a082354e]
- この間も俊太郎の詩をお  http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra   >:[   -- [[viagra]] &new{2010-03-08 (月) 12:43:52};
- この間も俊太郎の詩をお  http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra   >:[   -- [[viagra]] &new{2010-03-08 (月) 12:44:36};

* コメント [#comment]
#comment
#comment