---
category: swing
folder: CenterOneTouchButtons
title: JSplitPaneの展開・収納ボタンをDividerサイズの中央に配置する
tags: [JSplitPane, UIManager]
author: aterai
pubdate: 2022-08-08T02:07:09+09:00
description: JSplitPaneをすばやく展開/収納するためのJButtonがDividerサイズの中央に配置されるよう設定します。
image: https://drive.google.com/uc?id=1csOObqMc4lv3Xr4RDwhPjPeb7sMFomEa
---
* 概要 [#summary]
`JSplitPane`をすばやく展開/収納するための`JButton`が`Divider`サイズの中央に配置されるよう設定します。

#download(https://drive.google.com/uc?id=1csOObqMc4lv3Xr4RDwhPjPeb7sMFomEa)

* サンプルコード [#sourcecode]
#code(link){{
JSplitPane splitPane = new JSplitPane();
splitPane.setTopComponent(new JScrollPane(new JTable(8, 3)));
splitPane.setBottomComponent(new JScrollPane(new JTree()));
splitPane.setOneTouchExpandable(true);
splitPane.setDividerSize(32);

String key = "SplitPane.centerOneTouchButtons";
JCheckBox check = new JCheckBox(key, UIManager.getBoolean(key)) {
  @Override public void updateUI() {
    super.updateUI();
    EventQueue.invokeLater(() -> {
      boolean b = UIManager.getLookAndFeelDefaults().getBoolean(key);
      setSelected(b);
      UIManager.put(key, b);
      SwingUtilities.updateComponentTreeUI(splitPane);
    });
  }
};
check.setOpaque(false);
check.addActionListener(e -> {
  JCheckBox cb = (JCheckBox) e.getSource();
  UIManager.put(key, cb.isSelected());
  SwingUtilities.updateComponentTreeUI(splitPane);
});
}}

* 解説 [#explanation]
上記のサンプルでは`JSplitPane#setOneTouchExpandable(true)`で`OneTouchButton`を`Divider`内に表示するよう設定し、その配置位置を`UIManager.put("SplitPane.centerOneTouchButtons", Boolean)`で中央か左端(水平分割の場合)かを変更するテストを実施しています。

- `Divider`中央
-- 水平分割`JSplitPane`の場合は`Divider`の幅の中央
-- 垂直分割`JSplitPane`の場合は`Divider`の高さの中央
-- `JSplitPane#setDividerSize(...)`などで設定される`Divider`サイズが`OneTouchButton`アイコンのサイズと等しい場合、この設定は無意味になる
-- このため`JSplitPane#setDividerSize(...)`などで設定される`Divider`サイズが`OneTouchButton`アイコンのサイズと等しい場合、この設定は無意味になる
- `LookAndFeel`依存
-- `NimbusLookAndFeel`ではこの設定は無効で常に中央揃えになる
-- その他`BasicLookAndFeel`、`MetalLookAndFeel`、`WindowsLookAndFeel`などの初期値は`false`で、設定変更後に`SwingUtilities.updateComponentTreeUI(splitPane)`などで`UI`を更新すると表示に反映される
-- `GTKLookAndFeel`では`JSplitPane#setOneTouchExpandable(true)`を設定しても`OneTouchButton`は表示されない?

* 参考リンク [#reference]
- [[JSplitPaneのDividerを展開収納するOneTouchButtonのサイズ、色などを変更>Swing/OneTouchButton]]

* コメント [#comment]
#comment
#comment