• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセルをダブルクリック
#navi(../)
RIGHT:Posted by [[terai]] at 2004-06-28
*JTableのセルをダブルクリック [#h86d20ad]
JTableのセルをダブルクリックして内容を表示します。
---
category: swing
folder: DoubleClick
title: JTableのセルをダブルクリック
tags: [JTable, MouseListener]
author: aterai
pubdate: 2004-06-28T05:48:37+09:00
description: JTableのセルをダブルクリックして内容を表示します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTLv3qaXoI/AAAAAAAAAYE/aAnkonlteYo/s800/DoubleClick.png
---
* 概要 [#summary]
`JTable`のセルをダブルクリックして内容を表示します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTLv3qaXoI/AAAAAAAAAYE/aAnkonlteYo/s800/DoubleClick.png)

#screenshot

**サンプルコード [#t2033b2b]
#code{{
table.addMouseListener(new MouseInputAdapter() {
  public void mouseClicked(MouseEvent me) {
    int col = table.columnAtPoint(me.getPoint());
    if(col==0 && me.getClickCount()==2) {
      showInfo(me);
      table.repaint();
    }else{
      super.mouseClicked(me);
* サンプルコード [#sourcecode]
#code(link){{
table.setAutoCreateRowSorter(true);
table.addMouseListener(new MouseAdapter() {
  @Override public void mouseClicked(MouseEvent e) {
    if (e.getClickCount() >= 2) {
      Point pt = e.getPoint();
      int idx = table.rowAtPoint(pt);
      if (idx >= 0) {
        int row = table.convertRowIndexToModel(idx);
        String str = String.format(
          "%s (%s)", model.getValueAt(row, 1), model.getValueAt(row, 2));
        JOptionPane.showMessageDialog(
          table, str, "title", JOptionPane.INFORMATION_MESSAGE);
      }
    }
  }
});

private void showInfo(final MouseEvent me) {
  EventQueue.invokeLater(new Runnable() {
    public void run() {
      int row = sorter.modelIndex(table.rowAtPoint(me.getPoint()));
      String str = model.getValueAt(row, 1)+"("+model.getValueAt(row, 2)+")";
      JOptionPane.showMessageDialog(MainPanel.this, str, "タイトルバー",
                                    JOptionPane.INFORMATION_MESSAGE);
    }
  });
}
}}

**解説 [#h9a084b1]
上記のサンプルでは、0列目のセルをマウスでダブルクリックするとダイアログが開くようになっています。このとき、そのセルが編集状態になってしまわないように、編集不可にしておく必要があります。
* 解説 [#explanation]
- `JTable`に`MouseListener`を設定して`MouseEvent#getClickCount()`メソッドでマウスクリック数を取得し、これが`2`以上になる場合はセルがダブルクリックされたと判断
- `JTable`のセルはダブルクリックで編集開始がデフォルトなのですべてのセルを編集不可に設定

//**参考リンク
**コメント [#b0c89640]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/MouseEvent.html#getClickCount-- MouseEvent#getClickCount() (Java Platform SE 8)]

* コメント [#comment]
#comment
- 行以外の場所をダブルクリックすると`IndexOutOfBoundsException`が発生する不具合を修正。 -- &user(aterai); &new{2011-02-02 (水) 19:09:18};

#comment