概要

JSplitPaneDividerをワンクリックで展開・収納するためのOneTouchButtonのサイズ、オフセット、背景色などを変更します。

スクリーンショット

OneTouchButton.png

サンプルコード

UIManager.put("SplitPane.oneTouchButtonSize", 32);
UIManager.put("SplitPane.oneTouchButtonOffset", 50);
// UIManager.put("SplitPane.centerOneTouchButtons", true);

UIManager.put("SplitPaneDivider.border", BorderFactory.createLineBorder(Color.RED, 10));
UIManager.put("SplitPaneDivider.draggingColor", new Color(255, 100, 100, 100));

BasicSplitPaneDivider divider = ((BasicSplitPaneUI) splitPane.getUI()).getDivider();
divider.setBackground(Color.ORANGE);
for (Component c: divider.getComponents()) {
  if (c instanceof JButton) {
    JButton b = (JButton) c;
    b.setBackground(Color.ORANGE);
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、OneTouchButton(JSplitPaneDividerをワンクリックで展開・収納するためのJButton)のサイズ、オフセット、背景色などを変更しています。

  • OneTouchButtonのサイズ指定
    • UIManager.put("SplitPane.oneTouchButtonSize", 32);
    • MetalLookAndFeelでは無効
    • NimbusLookAndFeelでは無効でDividerのサイズに依存?
  • OneTouchButtonのオフセット指定
    • UIManager.put("oneTouchButtonOffset", 50);
    • JSplitPane.VERTICAL_SPLITの場合Dividerの左端からLeftOneTouchButtonまでの距離が設定可能
    • NimbusLookAndFeelのデフォルトは30になっているためJSplitPane.HORIZONTAL_SPLITDividerの高さがそれ以下の場合はOneTouchButtonが表示できない
  • OneTouchButtonの背景色
    • JButton#paint(...)がオーバーライドされてoneTouchButton.getBackground()の色で塗り潰されている(oneTouchButton.setOpaque(false)で透明にしても無意味)のでsetBackground()Dividerの背景色と同じ色を設定
      • OneTouchButtonの色や形はJButton#paint(...)の中で直接描画(Color.BLACK固定)されているため変更しづらい(BasicSplitPaneUIBasicSplitPaneDividerをオーバーライドする必要がある)
    • MetalLookAndFeelNimbusLookAndFeelでは無効
  • OneTouchButtonの中央揃え
    • UIManager.put("SplitPane.centerOneTouchButtons", true);
    • MetalLookAndFeelMotifLookAndFeelWindowsLookAndFeelNimbusLookAndFeelなどでは効果が無い
  • DividerBorderOneTouchButton
    • divider.setBorder(BorderFactory.createMatteBorder(20, 0, 5, 0, Color.RED));などを設定するとOneTouchButtonBorderにめり込んでしまう?

参考リンク

コメント