JScrollPane上にマウスカーソルが存在する場合のみJScrollBarを表示する
Total: 3344, Today: 1, Yesterday: 2
Posted by aterai at
Last-modified:
Summary
JScrollPane上にマウスカーソルが存在する場合だけ、縦JScrollBarが表示されるように設定します。
Screenshot

Advertisement
Source Code Examples
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);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@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;
}
// super.processMouseEvent(e, l);
}
}
View in GitHub: Java, KotlinDescription
- 上:
MouseListenerJScrollPane内部に配置したJTextAreaにMouseListenerを設定JTextArea上にマウスカーソルが入ったらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)でJScrollBarを表示JTextArea外にマウスカーソルが出たらJScrollPane#setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER)でJScrollBarを非表示
JScrollBar上にマウスカーソルが入るとJTextAreaからマウスカーソルが出たことになるのでカーソル表示などが点滅してしまう
- 下:
JLayerJScrollPaneに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を非表示