1 16 17 package org.mc4j.console.swing; 18 19 import java.awt.BasicStroke ; 20 import java.awt.BorderLayout ; 21 import java.awt.Color ; 22 import java.awt.Component ; 23 import java.awt.Dimension ; 24 import java.awt.FlowLayout ; 25 import java.awt.Graphics ; 26 import java.awt.Graphics2D ; 27 import java.awt.LayoutManager ; 28 import java.awt.Stroke ; 29 import java.awt.event.ComponentAdapter ; 30 import java.awt.event.ComponentEvent ; 31 import java.awt.event.WindowAdapter ; 32 import java.awt.event.WindowEvent ; 33 34 import javax.swing.BorderFactory ; 35 import javax.swing.BoxLayout ; 36 import javax.swing.ImageIcon ; 37 import javax.swing.JCheckBox ; 38 import javax.swing.JComponent ; 39 import javax.swing.JFrame ; 40 import javax.swing.JPanel ; 41 import javax.swing.JTable ; 42 43 62 public class ComponentBorder extends JPanel { 63 64 65 InnerPanel innerPanel; 66 SpacingPanel spacingPanel; 67 68 69 protected JComponent titleComponent; 70 71 int thickness; 72 Color lineColor; 73 JPanel contentsPanel; 74 75 public ComponentBorder(JComponent titleComponent, Color lineColor, int thickness) { 76 super(); 77 this.spacingPanel = new SpacingPanel(); 78 this.innerPanel = new InnerPanel(); 79 this.contentsPanel = new JPanel (); 80 this.contentsPanel.setOpaque(false); 81 82 83 87 innerPanel.setPositioning(InnerPanel.LEFT); 89 90 spacingPanel.setSpacing(5); 92 innerPanel.setOpaque(false); 93 spacingPanel.setOpaque(false); 94 95 this.titleComponent = titleComponent; 96 97 this.thickness = thickness; 98 this.lineColor = lineColor; 99 100 super.setLayout(new BoxLayout (this, BoxLayout.Y_AXIS)); 101 spacingPanel.add(this.titleComponent); 102 innerPanel.add(spacingPanel); 103 super.add(innerPanel); 104 int top = (int) this.titleComponent.getSize().getHeight(); 105 106 if ( top < thickness ) 107 top = thickness; 108 109 super.setBorder(BorderFactory.createEmptyBorder(0, thickness + 4, 0 , thickness + 4)); 111 super.add(this.contentsPanel); 112 113 this.contentsPanel.setLayout(new FlowLayout (FlowLayout.LEFT)); 114 115 this.titleComponent.addComponentListener(new ComponentAdapter () { 116 public void componentResized(ComponentEvent e) { 117 ComponentBorder.this.spacingPanel.invalidate(); 119 ComponentBorder.this.innerPanel.invalidate(); 120 } 121 }); 122 } 123 124 125 public void minimize() { 126 this.contentsPanel.setVisible(false); 127 invalidate(); 129 doLayout(); 130 repaint(); 131 } 132 133 public void maximize() { 134 this.contentsPanel.setVisible(true); 136 invalidate(); 137 doLayout(); 138 repaint(); 139 } 140 141 142 public JComponent getTitledComponent() { 143 return this.titleComponent; 144 } 145 146 154 public Component add(Component comp) { 155 return this.contentsPanel.add(comp); 156 } 157 158 165 public Component add(String name, Component comp) { 166 return this.contentsPanel.add(name, comp); 167 } 168 169 181 public Component add(Component comp, int index) { 182 return this.contentsPanel.add(comp, index); 183 } 184 185 198 public void add(Component comp, Object constraints) { 199 this.contentsPanel.add(comp, constraints); 200 } 201 202 218 public void add(Component comp, Object constraints, int index) { 219 this.contentsPanel.add(comp, constraints, index); 220 } 221 222 223 public void setLayout(LayoutManager layoutManager) { 224 if (this.contentsPanel != null) 225 this.contentsPanel.setLayout(layoutManager); 226 } 227 228 public void setOuterComponentPosition(int position) { 229 this.innerPanel.setPositioning(position); 230 } 231 232 233 public void paint(Graphics g) { 234 innerPanel.setLocation(0, 0); 235 super.paint(g); 236 } 237 238 239 public void paintBorder(Graphics g) { 240 Dimension d = getSize(); 241 int panelHeight = innerPanel.getHeight(); 242 int outerSpacing = thickness/2; 243 int x = outerSpacing; 244 int y = panelHeight / 2; 245 int width = d.width - 1 - 2*outerSpacing; 246 int height = d.height - y - 1 -outerSpacing; 247 248 Graphics2D gg = (Graphics2D ) g; 250 Stroke stroke = gg.getStroke(); 251 gg.setStroke(new BasicStroke (2)); 252 gg.setColor(new Color (153,204,255)); 253 256 gg.drawLine(x + 15, y + 7, x + width - 15, y + 7); 257 gg.setStroke(stroke); 258 259 } 260 261 public Dimension getMaximumSize() { 262 265 Dimension cpMax = this.contentsPanel.getComponent(0).getMaximumSize(); 266 if (!this.contentsPanel.isVisible()) 267 cpMax = new Dimension (0,0); 268 269 Dimension tMax = this.innerPanel.getMaximumSize(); 270 271 274 int w = Integer.MAX_VALUE; 275 int h = (int) 277 (cpMax.getHeight() + 10 + 278 tMax.getHeight()); 279 280 Dimension pSize = new Dimension (w, h); 281 return pSize; 283 } 284 285 public Dimension getMinimumSize() { 286 return getPreferredSize(); 287 } 288 289 public Dimension getPreferredSize() { 290 Dimension cpPref = this.contentsPanel.getComponent(0).getPreferredSize(); 291 Dimension tPref = this.innerPanel.getPreferredSize(); 292 293 if (!this.contentsPanel.isVisible()) 294 cpPref = new Dimension (0,0); 295 else 296 cpPref.setSize(cpPref.getWidth(), cpPref.getHeight()); 297 298 301 int w = (int) 302 (cpPref.getWidth() + tPref.getWidth()); 303 int h = (int) 304 (cpPref.getHeight() + 10 + 305 tPref.getHeight()); 306 307 Dimension pSize = new Dimension (w, h); 308 309 return pSize; 311 } 312 313 314 public class InnerPanel extends JPanel { 315 public static final int CUSTOM = 0; 316 public static final int LEFT = 1; 317 public static final int CENTER = 2; 318 public static final int RIGHT = 3; 319 private int positioning; 320 private int position; 321 322 323 public InnerPanel() { 324 this.positioning = CUSTOM; 325 this.position = 15; 326 this.setOpaque(false); 327 this.setDoubleBuffered(false); 328 } 329 330 public void setPositioning(int p) { 331 this.positioning = p; 332 } 333 334 public Dimension getPreferredSize() { 335 return getComponent(0).getPreferredSize(); 336 } 337 338 public Dimension getMaximumSize() { 339 Dimension size = getPreferredSize(); 340 341 return new Dimension (Integer.MAX_VALUE, (int) size.getHeight()); 342 } 343 344 345 public void paint(Graphics g) { 346 if (positioning < 0 || positioning > 3) 347 positioning = 1; 348 switch (positioning) { 349 case CUSTOM: 350 getComponent(0).setLocation(position, 0); 351 break; 352 case LEFT: 353 getComponent(0).setLocation(15, 0); 354 break; 355 case CENTER: 356 getComponent(0).setLocation(getParent().getWidth() / 2 - getPreferredSize().width / 2, 0); 357 break; 358 case RIGHT: 359 getComponent(0).setLocation(getParent().getWidth() - getPreferredSize().width - 15, 0); 360 break; } 361 super.paint(g); 362 } 363 } 364 365 public class SpacingPanel extends JPanel { 366 private int spacing; 367 368 public SpacingPanel() { 369 this.spacing = 0; 370 this.setOpaque(false); 371 } 372 373 public void setSpacing(int s) { 374 this.spacing = s; 375 } 376 377 public void paintComponent(Graphics g) { 378 getComponent(0).setLocation(spacing, 0); 379 super.paintComponent(g); 380 } 381 382 public Dimension getPreferredSize() { 383 Dimension ps = getComponent(0).getPreferredSize(); 384 Dimension d = new Dimension (ps.width + 2*spacing, ps.height); 385 return d; 386 } 387 } 388 389 public static void main(String args[]) { 390 JFrame fr = new JFrame (); 391 JCheckBox button = new JCheckBox (); 393 394 button.setIcon( 395 new ImageIcon ("ToggleOpen.gif")); 396 button.setDisabledIcon( 397 new ImageIcon ("ToggleClosed.gif")); 398 button.setSelectedIcon( 399 new ImageIcon ("org/mc4j/console/ToggleChanging.gif")); 400 button.setDisabledSelectedIcon( 401 new ImageIcon ("org/mc4j/console/ToggleChanging.gif")); 402 403 405 406 ComponentBorder c1 = new ComponentBorder(button, Color.darkGray, 4); 407 408 c1.setLayout(new BorderLayout ()); 409 c1.add(new JTable (new Object [][] { { "A", "B", "C" }, { "Foo", "Bar", "Baz"}, { "X", "Y", "Z" }}, new Object [] { "First", "Second", "Third" }) ,BorderLayout.CENTER); 410 411 fr.getContentPane().add(c1); 412 fr.pack(); 413 fr.setVisible(true); 414 fr.addWindowListener(new WindowAdapter () { 415 public void windowClosing(WindowEvent e) { 416 System.exit(0); 417 } 418 }); 419 } 420 421 } 422 | Popular Tags |