概要

JTabbedPaneで複数のランにタブをラップする場合でもタブ選択によるランの回転を無効にします。

サンプルコード

UIManager.put("TabbedPane.tabRunOverlay", 0);
UIManager.put("TabbedPane.selectedLabelShift", 0);
UIManager.put("TabbedPane.labelShift", 0);
UIManager.put("TabbedPane.selectedTabPadInsets", new Insets(0, 0, 0, 0));

JTabbedPane tabbedPane = new JTabbedPane() {
  @Override public void updateUI() {
    super.updateUI();
    setUI(new WindowsTabbedPaneUI() {
      @Override protected boolean shouldRotateTabRuns(int tabPlacement) {
        return false;
      }
    });
  }
};
view all

解説

  • 上: Default
    • MetalLookAndFeel以外のLookAndFeelではJTabbedPaneWRAP_TAB_LAYOUTで複数のランにタブをラップするレイアウトモードの場合、選択されたタブがタブコンテンツに接地するようランの回転が発生する
    • MetalLookAndFeelの場合、MetalTabbedPaneUI.TabbedPaneLayout#rotateTabRuns(int tabPlacement, int selectedRun)メソッドがオーバーライドされて空になっているため、タブ・ランの回転は発生しない
    • MetalTabbedPaneUI#shouldRotateTabRuns(int tabPlacement, int selectedRun)が常にfalseを返すよう設定されているが引数が2つあるこのメソッドは他では全く使用されておらず、BasicTabbedPaneUI#shouldRotateTabRuns(int tabPlacement)メソッドがオーバーライドされていないので無意味
      • 少なくともJava 5以前が存在するコピペミスのバグ?(@Overrideを使用できれば発覚していたはず)
  • 下: Override BasicTabbedPaneUI#shouldRotateTabRuns(...)
    • BasicTabbedPaneUI#shouldRotateTabRuns(int tabPlacement)メソッドをオーバーライドして常にfalseを返すよう設定し、タブ・ランの回転を無効化
    • UIManager.put("TabbedPane.tabRunOverlay", 0);を設定してタブ・ランの重なりを除去
    • UIManager.put("TabbedPane.labelShift", 0);UIManager.put("TabbedPane.selectedLabelShift", 0);を設定して、タブテキストのシフトを無効化
    • UIManager.put("TabbedPane.selectedTabPadInsets", new Insets(0, 0, 0, 0));を設定して、選択タブのサイズ拡張を無効化

参考リンク

コメント