• title: JSplitPaneのDividerを展開収納するOneTouchButtonのサイズ、色などを変更 tags: [JSplitPane, SplitPaneDivider, JButton, LookAndFeel] author: aterai pubdate: 2014-09-08T00:05:45+09:00 description: JSplitPaneのDividerをワンクリックで展開・収納するためのOneTouchButtonのサイズ、オフセット、背景色などを変更します。

概要

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

サンプルコード

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

解説

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

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

コメント