Swing/ListMouseSelection のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ListMouseSelection へ行く。
- 1 (2011-07-18 (月) 17:21:18)
- 2 (2011-07-19 (火) 12:24:06)
- 3 (2011-07-20 (水) 13:15:30)
- 4 (2011-07-20 (水) 19:33:29)
- 5 (2011-07-22 (金) 15:59:14)
- 6 (2011-07-24 (日) 07:58:36)
- 7 (2011-07-27 (水) 10:52:51)
- 8 (2011-07-27 (水) 13:13:20)
- 9 (2011-07-27 (水) 14:50:02)
- 10 (2012-05-30 (水) 15:18:25)
- 11 (2012-12-19 (水) 22:11:36)
- 12 (2012-12-27 (木) 14:16:01)
- 13 (2013-07-26 (金) 01:21:01)
- 14 (2013-09-03 (火) 01:31:47)
- 15 (2013-09-13 (金) 00:19:12)
- 16 (2014-08-12 (火) 02:10:09)
- 17 (2014-11-06 (木) 01:01:30)
- 18 (2014-11-25 (火) 03:03:31)
- 19 (2014-11-26 (水) 02:31:15)
- 20 (2014-11-26 (水) 17:01:53)
- 21 (2016-01-03 (日) 05:56:05)
- 22 (2016-09-30 (金) 15:47:33)
- 23 (2017-11-02 (木) 15:34:40)
- 24 (2017-11-09 (木) 14:09:56)
- 25 (2018-02-24 (土) 19:51:30)
- 26 (2018-10-11 (木) 17:47:50)
- 27 (2018-10-12 (金) 20:12:42)
- 28 (2020-10-06 (火) 14:51:14)
- 29 (2022-07-08 (金) 11:05:33)
- 30 (2022-08-20 (土) 22:15:25)
- 31 (2024-10-23 (水) 17:36:30)
- 32 (2025-01-03 (金) 08:57:02)
- 33 (2025-01-03 (金) 09:01:23)
- 34 (2025-01-03 (金) 09:02:38)
- 35 (2025-01-03 (金) 09:03:21)
- 36 (2025-01-03 (金) 09:04:02)
- 37 (2025-06-19 (木) 12:41:37)
- 38 (2025-06-19 (木) 12:43:47)
TITLE:JListをマウスクリックのみで複数選択する
Posted by aterai at 2011-07-18
JListをマウスクリックのみで複数選択する
`JList
`をアイテムをマウスクリックだけで複数選択できるように設定します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
JList list = new JList(model) {
private ClearSelectionListener listener;
@Override public void setSelectionInterval(int anchor, int lead) {
if(anchor==lead && lead>=0 && anchor>=0) {
if(listener.isDragging) {
addSelectionInterval(anchor, anchor);
}else if(!listener.isInCellDragging) {
if(isSelectedIndex(anchor)) {
removeSelectionInterval(anchor, anchor);
}else{
addSelectionInterval(anchor, anchor);
}
listener.isInCellDragging = true;
}
}else{
super.setSelectionInterval(anchor, lead);
}
}
};
View in GitHub: Java, Kotlin解説
- 左: `
Default
` - 中: `
MouseEvent
`- `
JList#processMouseEvent
,
JList#processMouseMotionEvent
`をオーバーライドして、常にCtrlキーが押されている状態にする - マウスでアイテムをドラッグしても選択状態は変わらない
- `
JList
の空白部分をクリックした場合、アイテムの選択状態は変更せず(
MouseEvent#consume()
)、フォーカスだけ
JList
`に移動 - 参考: Thread: JList where mouse click acts like ctrl-mouse click
- `
JList list = new JList(model) {
@Override protected void processMouseMotionEvent(MouseEvent e) {
super.processMouseMotionEvent(convertMouseEvent(e));
}
@Override protected void processMouseEvent(MouseEvent e) {
if(e.getID()==MouseEvent.MOUSE_PRESSED &&
!getCellBounds(0, getModel().getSize()-1).contains(e.getPoint())) {
e.consume();
requestFocusInWindow();
}else{
super.processMouseEvent(convertMouseEvent(e));
}
}
private MouseEvent convertMouseEvent(MouseEvent e) {
//Thread: JList where mouse click acts like ctrl-mouse click
//http://forums.oracle.com/forums/thread.jspa?messageID=5692411
return new MouseEvent(
(Component) e.getSource(),
e.getID(), e.getWhen(),
//e.getModifiers() | InputEvent.CTRL_MASK,
//select multiple objects in OS X: Command+click
//pointed out by nsby
e.getModifiers() | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(),
e.getX(), e.getY(),
e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
e.getButton());
}
};
- 右: `
SelectionInterval
`- `
JList#setSelectionInterval
をオーバーライドして、ひとつのアイテムのセルを選択した場合は、
JList#addSelectionInterval
、
JList#removeSelectionInterval
`を使用するように変更 - マウスでアイテムをドラッグすると、選択状態になる
- ひとつのアイテムのセル内でのドラッグでは、選択状態を変更しない
- 参考: Thread: JList where mouse click acts like ctrl-mouse click
- `
JList
`の空白部分をクリックした場合、アイテムの選択状態をすべてクリア(JListの選択を解除)
- `
参考リンク
コメント
- `
OSX(snow leopard)
では、
MouseEvent
`は複数選択が出来ません。キーボードを使っても(command+クリック)無理でした。 -- nsby?- ご指摘ありがとうございます。`
OSX
では「command+クリック」で複数選択でしたっけ?
InputEvent.CTRL_MASK
決め打ちではなく、
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
`に修正した方がいいのかもしれません(ソースなどを更新しましたが、正常に動作するかは確認していません…)。 -- aterai
- ご指摘ありがとうございます。`
- `
Web Start
でもう一度実行してみましたが、やはり出来ませんでした。
MouseEvent
`で複数選択ha -- nsby? - あ、変な所で切れてしまいました。すみません。あらためて、`
MouseEvent
`で複数選択出来るのは、Shift+クリックで選択した場合のみです。それ意外はダメでした。(Ctrl+クリックとかでもダメ) -- nsby?- `
Web Start
のキャッシュは、…関係なさそうですね。
src.zip
をダウンロードして
JList#processMouseEvent(...)
内で、
System.out.println(e);
したり
super.processMouseEvent(convertMouseEvent(e));
`だけにしてみるとどうなるでしょうか? -- aterai
- `
- `
MouseEvent e
`を出力してみました。ちゃんと処理してるように見えるんですが・・・
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() : 0x04 InputEvent.CTRL_MASK : 0x02
[ただのクリック]
java.awt.event.MouseEvent[MOUSE_PRESSED,(57,4),absolute(971,484),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alignmentY
=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFactory$Sy
stemColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x10
java.awt.event.MouseEvent[MOUSE_RELEASED,(57,4),absolute(971,484),button=1,modifiers=Button1,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alignmentY=0.0,border=,flags=5
0331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=39,
g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x10
java.awt.event.MouseEvent[MOUSE_CLICKED,(57,4),absolute(971,484),button=1,modifiers=Button1,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alignmentY=0.0,border=,flags=50
331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=39,g
=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x10
[Cntl + クリック]
java.awt.event.MouseEvent[MOUSE_PRESSED,(57,40),absolute(971,520),button=1,modifiers=?+Button1,extModifiers=?+Button1,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,align
mentY=0.0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFacto
ry$SystemColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x12
java.awt.event.MouseEvent[MOUSE_RELEASED,(57,40),absolute(971,520),button=1,modifiers=?+Button1,extModifiers=?,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alignmentY=0
.0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFactory$Syst
emColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x12
java.awt.event.MouseEvent[MOUSE_CLICKED,(57,40),absolute(971,520),button=1,modifiers=?+Button1,extModifiers=?,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alignmentY=0.
0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFactory$Syste
mColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x12
[Command + クリック]
java.awt.event.MouseEvent[MOUSE_PRESSED,(56,72),absolute(970,552),button=1,modifiers=?+Button1+Button3,extModifiers=?+Button1,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0
.0,alignmentY=0.0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaIm
ageFactory$SystemColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x14
java.awt.event.MouseEvent[MOUSE_RELEASED,(56,72),absolute(970,552),button=1,modifiers=?+Button1+Button3,extModifiers=?,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,alig
nmentY=0.0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFact
ory$SystemColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x14
java.awt.event.MouseEvent[MOUSE_CLICKED,(56,72),absolute(970,552),button=1,modifiers=?+Button1+Button3,extModifiers=?,clickCount=1] on example.MainPanel$1[,0,0,106x193,alignmentX=0.0,align
mentY=0.0,border=,flags=50332008,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=com.apple.laf.AquaImageFacto
ry$SystemColorProxy[r=39,g=118,b=218],selectionForeground=com.apple.laf.AquaImageFactory$SystemColorProxy[r=255,g=255,b=255],visibleRowCount=8,layoutOrientation=0] e.getModifiers() : 0x14
- ちなみに `
e.getModifiers() | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(),
を
e.getModifiers() | 0x01
,
#0x01
`は Shiftとかに無理矢理するとクリックだけでShiftと同じ動作になるんですけどね・・・。もう意味が分かりません。 -- nsby? - あら見づらくなりすみません。 -- nsby?
- ようするに、`
convertMouseEvent
内の
e.getModifiers()
に
0x02/0x04
を
or
しても
OSX
`では無視されてるようです。なぜなんでしょう? -- nsby?- ログ(勝手にすこし整形しました)どうもです。たしかにうまくいっているっぽいのに、不思議な感じですね。
`もうすこし調べてみます。 -- ateraiInputEvent.CTRL_DOWN_MASK
と
InputEvent.CTRL_MASK
`の違い?
- ログ(勝手にすこし整形しました)どうもです。たしかにうまくいっているっぽいのに、不思議な感じですね。
- メモ: Tailoring Java Applications for Mac OS X -- aterai
- ドラッグによる`
JList
`の複数選択は、JListのアイテムを範囲指定で選択を使用する方法もあります。 -- aterai