JSplitPaneのDividerにJPopupMenuやMouseListenerを追加してその位置を変更する
Total: 1732, Today: 2, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JSplitPaneのDividerにJPopupMenuやMouseListenerを追加してその位置を中央、最小、最大位置に変更するためのActionを設定します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
JPopupMenuBasicSplitPaneUI#getDivider()で取得可能なBasicSplitPaneDividerはJComponentを継承していないため、JComponent#setComponentPopupMenu(...)が使用不可- 代わりに
BasicLookAndFeel.AWTEventHelper#eventDispatched(...)でgetParent()で取得した親コンポーネントからJPopupMenuを取得して表示するよう特別処理されている - このため上記のサンプルでは
Dividerを右クリックするとその親であるJSplitPaneに設定したJPopupMenuが開く JSplitPaneに設定されたBorder上で右クリックした場合もJSplitPaneに設定したJPopupMenuが開くことになるので、JPopupMenu#show(...)をオーバーライドしてDividerのコンテナ領域がクリックされた場合のみJPopupMenuを開くよう設定(JCheckBoxで切り替えてテスト可能)
MouseListenerBasicSplitPaneUI#getDivider()で取得可能なBasicSplitPaneDividerはContainerを継承するため、Component#addMouseListener(...)でMouseListenerが使用可能- マウスの左ボタンでダブルクリックすると
Dividerの位置を中央に移動するMouseListenerを設定 - たとえば
Windows環境だけ考慮すればよい場合、JComponent#setComponentPopupMenu(...)を使用せずにMouseListener#mouseReleased(...)でif (e.isPopupTrigger()) { popup.show(divider, e.getX(), e.getY()); }を実行してJPopupMenuを表示する方法もある