-
Notifications
You must be signed in to change notification settings - Fork 156
/
MainPanel.java
98 lines (86 loc) · 3.09 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
// -*- mode:java; encoding:utf-8 -*-
// vim:set fileencoding=utf-8:
// @homepage@
package example;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Objects;
import java.util.stream.IntStream;
import javax.swing.*;
public final class MainPanel extends JPanel {
private MainPanel() {
super(new BorderLayout());
JTabbedPane tabs = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
String help = "Ctrl + ScrollButton Click: scroll to first/last tabs";
tabs.addTab("title0", new JLabel(help));
IntStream.range(1, 100).forEach(i -> tabs.addTab("title" + i, new JLabel("label" + i)));
ActionMap am = tabs.getActionMap();
String forward = "scrollTabsForwardAction";
am.put(forward, new ScrollTabsAction(tabs, am.get(forward)));
String backward = "scrollTabsBackwardAction";
am.put(backward, new ScrollTabsAction(tabs, am.get(backward)));
add(tabs);
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);
}
}
class ScrollTabsAction extends AbstractAction {
private final JTabbedPane tabbedPane;
private final transient Action action;
private final int index;
protected ScrollTabsAction(JTabbedPane tabbedPane, Action action) {
super();
this.tabbedPane = tabbedPane;
this.action = action;
Object name = action.getValue(NAME);
String forward = "scrollTabsForwardAction";
this.index = Objects.equals(name, forward) ? tabbedPane.getTabCount() - 1 : 0;
}
@Override public void actionPerformed(ActionEvent e) {
if (action != null && action.isEnabled()) {
boolean isCtrlDown = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
if (isCtrlDown) {
scrollTabAt(tabbedPane, index);
} else {
action.actionPerformed(new ActionEvent(tabbedPane,
ActionEvent.ACTION_PERFORMED, null,
e.getWhen(), e.getModifiers()));
}
}
}
public static void scrollTabAt(JTabbedPane tabbedPane, int index) {
Component cmp = null;
for (Component c : tabbedPane.getComponents()) {
if (Objects.equals("TabbedPane.scrollableViewport", c.getName())) {
cmp = c;
break;
}
}
if (cmp instanceof JViewport) {
JViewport viewport = (JViewport) cmp;
Dimension d = tabbedPane.getSize();
Rectangle r = tabbedPane.getBoundsAt(index);
int gw = (d.width - r.width) / 2;
r.grow(gw, 0);
viewport.scrollRectToVisible(r);
}
}
}