Swing/ScrollBarOnHover のバックアップの現在との差分(No.1)
- category: swing folder: ScrollBarOnHover title: JScrollPane上にマウスカーソルが存在する場合のみJScrollBarを表示する tags: [JScrollPane, JScrollBar, JLayer, MouseListener] author: aterai pubdate: 2017-07-31T16:08:05+09:00 description: JScrollPane上にマウスカーソルが存在する場合だけ、縦JScrollBarが表示されるように設定します。 image: https://drive.google.com/uc?export=view&id=19tpZyfx24XIIJHmLNjzpSlSQg_GAPDwkUA image: https://drive.google.com/uc?id=19tpZyfx24XIIJHmLNjzpSlSQg_GAPDwkUA
概要
JScrollPane
上にマウスカーソルが存在する場合だけ、縦JScrollBar
が表示されるように設定します。
Screenshot
Advertisement
Screenshot
Advertisement
サンプルコード
class ScrollBarOnHoverLayerUI extends LayerUI<JScrollPane> {
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
}
}
#spanadd
#spanend
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
#spanadd
#spanend
@Override protected void processMouseEvent(
MouseEvent e, JLayer<? extends JScrollPane> l) {
JScrollPane sp = l.getView();
switch (e.getID()) {
case MouseEvent.MOUSE_ENTERED:
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
break;
case MouseEvent.MOUSE_EXITED:
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
break;
default:
break;
case MouseEvent.MOUSE_ENTERED:
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
break;
case MouseEvent.MOUSE_EXITED:
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
break;
default:
break;
}
// super.processMouseEvent(e, l);
}
}
View in GitHub: Java, Kotlin解説
- 上:
MouseListener
JScrollPane
内部に配置したJTextArea
にMouseListener
を設定-
JTextArea
上にマウスカーソルが入ったらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
でJScrollBar
を表示 -
JTextArea
上からマウスカーソルが出たらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
でJScrollBar
を非表示
-
-
JScrollBar
上にマウスカーソルが入ると、JTextArea
からマウスカーソルが出たことになるので、カーソル表示などが点滅してしまう-
JTextArea
上にマウスカーソルが入ったらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
でJScrollBar
を表示 -
JTextArea
外にマウスカーソルが出たらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER)
でJScrollBar
を非表示
-
-
JScrollBar
上にマウスカーソルが入るとJTextArea
からマウスカーソルが出たことになるのでカーソル表示などが点滅してしまう
- 下:
JLayer
JScrollPane
にJLayer
を設定-
JLayer#setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
を指定し、JLayer
と**そのすべての下位オブジェクト**からのマウスイベントをprocessMouseEvent(...)
メソッドで受け取るよう設定-
JLayer
上にマウスカーソルが入ったらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
でJScrollBar
を表示 -
JLayer
上からマウスカーソルが出たらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
でJScrollBar
を非表示
-
-
JLayer#setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
を指定し、JLayer
とそのすべての下位オブジェクトからのマウスイベントをprocessMouseEvent(...)
メソッドで受け取るよう設定-
JLayer
上にマウスカーソルが入ったらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
でJScrollBar
を表示 -
JLayer
外にマウスカーソルが出たらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER)
でJScrollBar
を非表示
-
参考リンク
- JLayer#setLayerEventMask(long) (Java Platform SE 8)
- JLayer#setLayerEventMask(long) (Java Platform SE 8)
- JScrollBarを半透明にする