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 package com.buckosoft.fibs.BuckoFIBS.gui.chatWindow;
65
66 import java.awt.BasicStroke;
67 import java.awt.Color;
68 import java.awt.Component;
69 import java.awt.Dimension;
70 import java.awt.FlowLayout;
71 import java.awt.Graphics;
72 import java.awt.Graphics2D;
73 import java.awt.event.ActionEvent;
74 import java.awt.event.ActionListener;
75 import java.awt.event.MouseAdapter;
76 import java.awt.event.MouseEvent;
77 import java.awt.event.MouseListener;
78
79 import javax.swing.AbstractButton;
80 import javax.swing.BorderFactory;
81 import javax.swing.JButton;
82 import javax.swing.JLabel;
83 import javax.swing.JPanel;
84 import javax.swing.plaf.basic.BasicButtonUI;
85
86
87
88
89
90
91
92
93 public class ButtonTabComponent extends JPanel {
94 private static final long serialVersionUID = 1L;
95 private final ChatTabs pane;
96
97 public ButtonTabComponent(final ChatTabs pane) {
98
99 super(new FlowLayout(FlowLayout.LEFT, 0, 0));
100 if (pane == null) {
101 throw new NullPointerException("TabbedPane is null");
102 }
103 this.pane = pane;
104 setOpaque(false);
105
106
107 JLabel label = new JLabel() {
108 private static final long serialVersionUID = 1L;
109
110 public String getText() {
111 int i = pane.indexOfTabComponent(ButtonTabComponent.this);
112 if (i != -1) {
113 return pane.getTitleAt(i);
114 }
115 return null;
116 }
117 };
118
119 add(label);
120
121 label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2));
122
123 JButton button = new TabButton();
124 add(button);
125
126 setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
127 }
128
129 private class TabButton extends JButton implements ActionListener {
130 private static final long serialVersionUID = 1L;
131
132 public TabButton() {
133 int size = 17;
134 setPreferredSize(new Dimension(size, size));
135 setToolTipText("close this tab");
136
137 setUI(new BasicButtonUI());
138
139 setContentAreaFilled(false);
140
141 setFocusable(false);
142 setBorder(BorderFactory.createEtchedBorder());
143 setBorderPainted(false);
144
145
146 addMouseListener(buttonMouseListener);
147 setRolloverEnabled(true);
148
149 addActionListener(this);
150 }
151
152 public void actionPerformed(ActionEvent e) {
153 int i = pane.indexOfTabComponent(ButtonTabComponent.this);
154 if (i != -1) {
155 pane.remove(i);
156 }
157 }
158
159
160 public void updateUI() {
161 }
162
163
164 protected void paintComponent(Graphics g) {
165 super.paintComponent(g);
166 Graphics2D g2 = (Graphics2D) g.create();
167
168 if (getModel().isPressed()) {
169 g2.translate(1, 1);
170 }
171 g2.setStroke(new BasicStroke(2));
172 g2.setColor(Color.BLACK);
173 if (getModel().isRollover()) {
174 g2.setColor(Color.MAGENTA);
175 }
176 int delta = 6;
177 g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
178 g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
179 g2.dispose();
180 }
181 }
182
183 private final static MouseListener buttonMouseListener = new MouseAdapter() {
184 public void mouseEntered(MouseEvent e) {
185 Component component = e.getComponent();
186 if (component instanceof AbstractButton) {
187 AbstractButton button = (AbstractButton) component;
188 button.setBorderPainted(true);
189 }
190 }
191
192 public void mouseExited(MouseEvent e) {
193 Component component = e.getComponent();
194 if (component instanceof AbstractButton) {
195 AbstractButton button = (AbstractButton) component;
196 button.setBorderPainted(false);
197 }
198 }
199 };
200 }
201
202