概要

JSplitPaneをすばやく展開/収納するためのJButtonDividerサイズの中央に配置されるよう設定します。

スクリーンショット

Swing/CenterOneTouchButtons.png

サンプルコード

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);
});
View in GitHub: Java, Kotlin

解説

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

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

参考リンク

コメント