/
MainPanel.java
132 lines (115 loc) · 4.43 KB
/
MainPanel.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// -*- mode:java; encoding:utf-8 -*-
// vim:set fileencoding=utf-8:
// @homepage@
package example;
import com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI;
import java.awt.*;
import java.awt.event.ItemEvent;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
public final class MainPanel extends JPanel {
private MainPanel() {
super(new BorderLayout());
JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT) {
@Override public void updateUI() {
super.updateUI();
if (getUI() instanceof WindowsTabbedPaneUI) {
setUI(new WindowsTabHeightTabbedPaneUI());
} else {
setUI(new BasicTabHeightTabbedPaneUI());
}
}
};
tabbedPane.addTab("00000", new JLabel("aaa aaa aaa aa"));
tabbedPane.addTab("111112", new JLabel("bbb bbb bbb bbb bb bb"));
tabbedPane.addTab("22222232", new JScrollPane(new JTree()));
tabbedPane.addTab("3333333333", new JSplitPane());
JComboBox<? extends Enum<?>> comboBox = new JComboBox<>(TabPlacements.values());
comboBox.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
tabbedPane.setTabPlacement(((TabPlacements) e.getItem()).getTabPlacement());
}
});
Box box = Box.createHorizontalBox();
box.add(Box.createHorizontalGlue());
box.add(new JLabel("TabPlacement: "));
box.add(Box.createHorizontalStrut(2));
box.add(comboBox);
box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
add(tabbedPane);
add(box, BorderLayout.SOUTH);
setPreferredSize(new Dimension(320, 240));
}
public static void main(String[] args) {
EventQueue.invokeLater(MainPanel::createAndShowGui);
}
private static void createAndShowGui() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException ignored) {
Toolkit.getDefaultToolkit().beep();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
ex.printStackTrace();
return;
}
JFrame frame = new JFrame("@title@");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
enum TabPlacements {
TOP(SwingConstants.TOP),
BOTTOM(SwingConstants.BOTTOM),
LEFT(SwingConstants.LEFT),
RIGHT(SwingConstants.RIGHT);
private final int tabPlacement;
TabPlacements(int tabPlacement) {
this.tabPlacement = tabPlacement;
}
public int getTabPlacement() {
return tabPlacement;
}
}
class WindowsTabHeightTabbedPaneUI extends WindowsTabbedPaneUI {
private static final int TAB_AREA_HEIGHT = 32;
@Override protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) {
return TAB_AREA_HEIGHT; // super.calculateTabHeight(tabPlacement, tabIndex, fontHeight) + 4;
}
// @Override public Rectangle getTabBounds(JTabbedPane pane, int i) {
// Rectangle tabRect = super.getTabBounds(pane, i);
// tabRect.translate(0, -16);
// tabRect.height = 16;
// return tabRect;
// }
@Override protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect) {
boolean tob = tabPlacement == TOP || tabPlacement == BOTTOM;
if (tob && tabPane.getSelectedIndex() != tabIndex) {
int tabHeight = TAB_AREA_HEIGHT / 2 + 3;
rects[tabIndex].height = tabHeight;
if (tabPlacement == TOP) {
rects[tabIndex].y = TAB_AREA_HEIGHT - tabHeight + 3;
}
}
super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect);
}
}
class BasicTabHeightTabbedPaneUI extends BasicTabbedPaneUI {
private static final int TAB_AREA_HEIGHT = 32;
@Override protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) {
return TAB_AREA_HEIGHT;
}
@Override protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect) {
boolean tob = tabPlacement == TOP || tabPlacement == BOTTOM;
if (tob && tabPane.getSelectedIndex() != tabIndex) {
int tabHeight = TAB_AREA_HEIGHT / 2 + 3;
rects[tabIndex].height = tabHeight;
if (tabPlacement == TOP) {
rects[tabIndex].y = TAB_AREA_HEIGHT - tabHeight + 3;
}
}
super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect);
}
}