Swing/DividerMouseEvent のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DividerMouseEvent へ行く。
- 1 (2021-07-26 (月) 02:31:25)
- 2 (2024-05-19 (日) 06:14:29)
- category: swing folder: DividerMouseEvent title: JSplitPaneのDividerにJPopupMenuやMouseListenerを追加してその位置を変更する tags: [JSplitPane, Divider, JPopupMenu, MouseListener] author: aterai pubdate: 2021-07-26T02:28:40+09:00 description: JSplitPaneのDividerにJPopupMenuやMouseListenerを追加してその位置を中央、最小、最大位置に変更するためのActionを設定します。 image: https://drive.google.com/uc?id=1JNqfni40ogZAmYoqP76Sw3gg8BvdRMVK
概要
JSplitPane
のDivider
にJPopupMenu
やMouseListener
を追加してその位置を中央、最小、最大位置に変更するためのAction
を設定します。
Screenshot
![Swing/DividerMouseEvent screenshot](https://ateraimemo.com/swing/dividermouseevent/screenshot.png)
Advertisement
サンプルコード
JCheckBox check = new JCheckBox("Show JPopupMenu only on Divider", true);
JPopupMenu popup = new JPopupMenu() {
@Override public void show(Component invoker, int x, int y) {
if (check.isSelected() && invoker instanceof JSplitPane) {
BasicSplitPaneUI ui = (BasicSplitPaneUI) ((JSplitPane) invoker).getUI();
if (ui.getDivider().getBounds().contains(x, y)) {
super.show(invoker, x, y);
}
} else {
super.show(invoker, x, y);
}
}
};
popup.add("center").addActionListener(e -> splitPane.setDividerLocation(.5));
popup.add("selectMin").addActionListener(e -> selectMinMax(splitPane, "selectMin"));
popup.add("selectMax").addActionListener(e -> selectMinMax(splitPane, "selectMax"));
splitPane.setComponentPopupMenu(popup);
BasicSplitPaneUI ui = (BasicSplitPaneUI) splitPane.getUI();
Container divider = ui.getDivider();
divider.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() >= 2) {
splitPane.setDividerLocation(.5);
}
}
// @Override public void mouseReleased(MouseEvent e) {
// if (e.isPopupTrigger()) {
// popup.show(divider, e.getX(), e.getY());
// }
// }
});
View in GitHub: Java, Kotlin解説
JPopupMenu
BasicSplitPaneUI#getDivider()
で取得可能なBasicSplitPaneDivider
はJComponent
を継承していないため、JComponent#setComponentPopupMenu(...)
が使用不可- 代わりに
BasicLookAndFeel.AWTEventHelper#eventDispatched(...)
でgetParent()
で取得した親コンポーネントからJPopupMenu
を取得して表示するよう特別処理されている - このため上記のサンプルでは
Divider
を右クリックするとその親であるJSplitPane
に設定したJPopupMenu
が開く JSplitPane
に設定されたBorder
上で右クリックした場合もJSplitPane
に設定したJPopupMenu
が開くことになるので、JPopupMenu#show(...)
をオーバーライドしてDivider
のコンテナ領域がクリックされた場合のみJPopupMenu
を開くよう設定(JCheckBox
で切り替えてテスト可能)
MouseListener
BasicSplitPaneUI#getDivider()
で取得可能なBasicSplitPaneDivider
はContainer
を継承するため、Component#addMouseListener(...)
でMouseListener
が使用可能- マウスの左ボタンでダブルクリックすると
Divider
の位置を中央に移動するMouseListener
を設定 - たとえば
Windows
環境だけ考慮すればよい場合、JComponent#setComponentPopupMenu(...)
を使用せずにMouseListener#mouseReleased(...)
でif (e.isPopupTrigger()) { popup.show(divider, e.getX(), e.getY()); }
を実行してJPopupMenu
を表示する方法もある