Swing/FlatTabbedPane のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FlatTabbedPane へ行く。
- category: swing folder: FlatTabbedPane title: JTabbedPaneのタブ描画をフラットデザイン風に変更する tags: [JTabbedPane, BasicLookAndFeel] author: aterai pubdate: 2018-08-20T16:17:33+09:00 description: JTabbedPaneのタブに描画される縁やテキストシフトなどを無効にしてフラットデザイン風に変更します。 image: https://drive.google.com/uc?id=1HQCaLqj1ikLRJCljsjabjF2MS_a-UDhuNw
概要
JTabbedPane
のタブに描画される縁やテキストシフトなどを無効にしてフラットデザイン風に変更します。
Screenshot
Advertisement
サンプルコード
UIManager.put("TabbedPane.tabInsets", new Insets(5, 10, 5, 10));
UIManager.put("TabbedPane.selectedLabelShift", 0);
UIManager.put("TabbedPane.labelShift", 0);
// UIManager.put("TabbedPane.foreground", Color.WHITE);
// UIManager.put("TabbedPane.selectedForeground", Color.WHITE);
// UIManager.put("TabbedPane.unselectedBackground", UNSELECTED_BG);
UIManager.put("TabbedPane.tabAreaBackground", UNSELECTED_BG);
JTabbedPane tabs = new JTabbedPane() {
@Override public void updateUI() {
super.updateUI();
setUI(new BasicTabbedPaneUI() {
@Override protected void paintFocusIndicator(
Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex,
Rectangle iconRect, Rectangle textRect, boolean isSelected) {
// Do not paint anything
}
@Override protected void paintTabBorder(
Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected) {
// Do not paint anything
}
@Override protected void paintTabBackground(
Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected) {
g.setColor(isSelected ? SELECTED_BG : UNSELECTED_BG);
g.fillRect(x - 1, y, w + 1, h); // -1: default labelShift? magic number
}
});
setOpaque(true);
setForeground(Color.WHITE);
setTabPlacement(SwingConstants.LEFT);
setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}
};
View in GitHub: Java, Kotlin解説
上記のサンプルでは、タブの縁やフォーカスなどの描画を無効にしたBasicTabbedPaneUI
を作成してJTabbedPane
に設定することで、フラットデザイン風のJTabbedPane
を実現しています。
TabbedPane.selectedLabelShift
とTabbedPane.labelShift
を0
にして選択時の文字列シフトを無効化JTabbedPane#setOpaque(true)
とTabbedPane.tabAreaBackground
を設定して、タブエリアの背景色を変更BasicTabbedPaneUI#paintFocusIndicator(...)
メソッドをオーバーライドして、フォーカスの点線を非表示BasicTabbedPaneUI#paintTabBorder(...)
メソッドをオーバーライドして、タブの縁を非表示BasicTabbedPaneUI#paintTabBackground(...)
メソッドをオーバーライドして、タブの背景を塗りつぶす- 例えば
JTabbedPane#setTabPlacement(SwingConstants.LEFT)
でタブエリアが左にある場合、タブの左側に1px
の隙間ができる TabbedPane.selectedLabelShift
またはTabbedPane.labelShift
のデフォルト値が決め打ちで入っている?- このサンプルでは左に
1px
タブ領域を拡大して対応
- 例えば
参考リンク
- JTabbedPaneのタブエリア背景色などをテスト
- JDK-7010561 Tab text position with Synth based LaF is different to Java 5/6 - Java Bug System