• category: swing folder: ToolBarSeparatorSize title: JToolBar専用JSeparatorのサイズを指定する tags: [JToolBar, JSeparator, UIManager] author: aterai pubdate: 2023-04-24T05:02:52+09:00 description: JToolBar専用JToolBar.Separatorのサイズ変更をテストします。 image: https://drive.google.com/uc?id=1DUJCi9uB6NXFr0uKs3fvCHLW4Z_0xpbl

概要

JToolBar専用JToolBar.Separatorのサイズ変更をテストします。

サンプルコード

// UIManager.put("ToolBar.separatorSize", new Dimension(2, 20));
JToolBar bar = new JToolBar();
bar.add(new JCheckBox("JCheckBox"));
bar.addSeparator();
bar.add(new JRadioButton("JRadioButton"));
bar.addSeparator(new Dimension(32, 32));
bar.add(new JButton("JButton"));
bar.addSeparator(new Dimension(10, 10));
bar.add(new JToggleButton("JToggleButton"));
bar.add(Box.createVerticalGlue());

SpinnerNumberModel mw = new SpinnerNumberModel(10, -10, 50, 1);
SpinnerNumberModel mh = new SpinnerNumberModel(32, -10, 50, 1);
ChangeListener cl = e -> {
  Dimension d = new Dimension(
      mw.getNumber().intValue(), mh.getNumber().intValue());
  for (Component c : bar.getComponents()) {
    if (c instanceof JToolBar.Separator) {
      ((JToolBar.Separator) c).setSeparatorSize(d);
    }
  }
  bar.revalidate();
};
mw.addChangeListener(cl);
mh.addChangeListener(cl);
View in GitHub: Java, Kotlin

解説

  • JToolBar#addSeparator(Dimension)メソッドでJToolBarにサイズを指定してJSeparatorを追加可能
  • UIManager.put("ToolBar.separatorSize", new Dimension(...))でまとめてデフォルトのJToolBar.Separatorのサイズ指定する方法もある
    • UIManager.put("ToolBar.separatorSize", new Dimension(...))を使用した水平JToolBarの場合、幅が高さ、高さが幅に自動的に入れ替わる
  • JToolBar.SeparatorのサイズをJToolBar#addSeparator(Dimension)JToolBar.Separator#setSeparatorSize(...)で指定して水平JToolBarを垂直JToolBarに変換:
    • UIManager.put("ToolBar.separatorSize", new Dimension(...))を使用した場合と異なり、幅と高さの入れ替えは発生しない
    • WindowsLookAndFeelの場合、区切り線は指定した幅までのみ描画され、親JToolBarの幅まで拡張されない
    • NimbusLookAndFeelの場合、区切り点線は親JToolBarの幅まで拡張して描画される
  • JToolBar.Separator#setSeparatorSize(Dimension)
    • 負のサイズを設定してもエラーにはならない
    • nullを設定してもなにも変化せず、初期状態に戻せない?
    • このサンプルでは以下のように一旦JToolBar#removeAll()ですべてのコンポーネントを削除してからサイズ指定なしでJToolBar#addSeparator()を使用してJToolBar.Separatorを追加しなおしている
JButton button = new JButton("reset");
button.addActionListener(e -> {
  Component[] list = bar.getComponents();
  bar.removeAll();
  for (Component c : list) {
    if (c instanceof JToolBar.Separator) {
      bar.addSeparator();
    } else {
      bar.add(c);
    }
  }
});

参考リンク

コメント