概要

NimbusLookAndFeelを適用したJTabbedPaneのスクロール矢印ボタンがBasicArrowButtonSynthArrowButtonのどちらを使用するかを切り替えます。

サンプルコード

JTabbedPane tabs = new JTabbedPane();
tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
IntStream.range(0, 100)
    .forEach(i -> tabs.addTab("title" + i, new JLabel("label" + i)));

String key = "TabbedPane.useBasicArrows";
// UIManager.put(key, Boolean.FALSE);
// UIManager.put("ArrowButton.size", 24);

JCheckBox check = new JCheckBox(key, UIManager.getBoolean(key));
check.addActionListener(e -> {
  boolean b = ((JCheckBox) e.getSource()).isSelected();
  UIManager.put(key, b);
  SwingUtilities.updateComponentTreeUI(tabs);
});
View in GitHub: Java, Kotlin

解説

  • TabbedPane.useBasicArrows: Boolean.TRUE
    • NimbusLookAndFeelのデフォルトでJTabbedPaneのスクロール矢印ボタンとしてBasicArrowButtonを使用する
  • TabbedPane.useBasicArrows: Boolean.FALSE
    • JTabbedPaneのスクロール矢印ボタンとしてSynthArrowButtonを継承したSynthScrollableTabButtonを使用する
    • UIManager.put("ArrowButton.size", 24)などでスクロール矢印ボタンのサイズ変更が可能

  • Java 11GTKLookAndFeelJTabbedPane.SCROLL_TAB_LAYOUTを設定した場合のバグ?
    • スクロール矢印ボタンをクリックするとGtk-CRITICAL **: ...: gtk_render_frame_gap: assertion 'xy0_gap >= 0' failedと警告がコンソールに表示される
    • GTKLookAndFeelのデフォルトでJSpinnerの下矢印ボタンが2つ左右に並んで表示される
      • これはUIManager.put("TabbedPane.useBasicArrows", Boolean.TRUE)の設定で回避が可能

参考リンク

コメント