001 /* BorderUIResource.java
002 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
003
004 This file is part of GNU Classpath.
005
006 GNU Classpath is free software; you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation; either version 2, or (at your option)
009 any later version.
010
011 GNU Classpath is distributed in the hope that it will be useful, but
012 WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with GNU Classpath; see the file COPYING. If not, write to the
018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019 02110-1301 USA.
020
021 Linking this library statically or dynamically with other modules is
022 making a combined work based on this library. Thus, the terms and
023 conditions of the GNU General Public License cover the whole
024 combination.
025
026 As a special exception, the copyright holders of this library give you
027 permission to link this library with independent modules to produce an
028 executable, regardless of the license terms of these independent
029 modules, and to copy and distribute the resulting executable under
030 terms of your choice, provided that you also meet, for each linked
031 independent module, the terms and conditions of the license of that
032 module. An independent module is a module which is not derived from
033 or based on this library. If you modify this library, you may extend
034 this exception to your version of the library, but you are not
035 obligated to do so. If you do not wish to do so, delete this
036 exception statement from your version. */
037
038
039 package javax.swing.plaf;
040
041 import java.awt.Color;
042 import java.awt.Component;
043 import java.awt.Font;
044 import java.awt.Graphics;
045 import java.awt.Insets;
046 import java.io.Serializable;
047
048 import javax.swing.Icon;
049 import javax.swing.border.BevelBorder;
050 import javax.swing.border.Border;
051 import javax.swing.border.CompoundBorder;
052 import javax.swing.border.EmptyBorder;
053 import javax.swing.border.EtchedBorder;
054 import javax.swing.border.LineBorder;
055 import javax.swing.border.MatteBorder;
056 import javax.swing.border.TitledBorder;
057
058 /**
059 * A wrapper for {@link javax.swing.border.Border} that also
060 * implements the {@link UIResource} marker interface. This is useful
061 * for implementing pluggable look-and-feels: When switching the
062 * current LookAndFeel, only those borders are replaced that are
063 * marked as {@link UIResource}. For this reason, a look-and-feel
064 * should always install borders that implement
065 * <code>UIResource</code>, such as the borders provided by this
066 * class.
067 *
068 * @serial
069 * @serialField delegate Border the <code>Border</code> wrapped
070 *
071 * @author Brian Jones (cbj@gnu.org)
072 * @author Sascha Brawer (brawer@dandelis.ch)
073 */
074 public class BorderUIResource implements Border, UIResource, Serializable
075 {
076 /**
077 * Verified using the <code>serialver</code> tool
078 * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5.
079 */
080 static final long serialVersionUID = -3440553684010079691L;
081
082
083 /**
084 * A shared instance of an {@link EtchedBorderUIResource}, or
085 * <code>null</code> if the {@link #getEtchedBorderUIResource()}
086 * method has not yet been called.
087 */
088 private static Border etchedBorderUIResource;
089
090
091 /**
092 * A shared instance of a {@link BevelBorderUIResource} whose
093 * <code>bevelType</code> is {@link
094 * javax.swing.border.BevelBorder#LOWERED}, or <code>null</code> if
095 * the {@link #getLoweredBevelBorderUIResource()} has not yet been
096 * called.
097 */
098 private static Border loweredBevelBorderUIResource;
099
100
101 /**
102 * A shared instance of a {@link BevelBorderUIResource} whose
103 * <code>bevelType</code> is {@link
104 * javax.swing.border.BevelBorder#RAISED}, or <code>null</code> if
105 * the {@link #getRaisedBevelBorderUIResource()} has not yet been
106 * called.
107 */
108 private static Border raisedBevelBorderUIResource;
109
110
111 /**
112 * A shared instance of a {@link LineBorderUIResource} for
113 * a one-pixel thick black line, or <code>null</code> if
114 * the {@link #getBlackLineBorderUIResource()} has not yet been
115 * called.
116 */
117 private static Border blackLineBorderUIResource;
118
119
120 /**
121 * Returns a shared instance of an etched border which also
122 * is marked as an {@link UIResource}.
123 *
124 * @see javax.swing.border.EtchedBorder
125 */
126 public static Border getEtchedBorderUIResource()
127 {
128 /* Swing is not designed to be thread-safe, so there is no
129 * need to synchronize the access to the global variable.
130 */
131 if (etchedBorderUIResource == null)
132 etchedBorderUIResource = new EtchedBorderUIResource();
133 return etchedBorderUIResource;
134 }
135
136
137 /**
138 * Returns a shared instance of {@link BevelBorderUIResource} whose
139 * <code>bevelType</code> is {@link
140 * javax.swing.border.BevelBorder#LOWERED}.
141 *
142 * @see javax.swing.border.BevelBorder
143 */
144 public static Border getLoweredBevelBorderUIResource()
145 {
146 /* Swing is not designed to be thread-safe, so there is no
147 * need to synchronize the access to the global variable.
148 */
149 if (loweredBevelBorderUIResource == null)
150 loweredBevelBorderUIResource = new BevelBorderUIResource(
151 BevelBorder.LOWERED);
152 return loweredBevelBorderUIResource;
153 }
154
155
156 /**
157 * Returns a shared instance of {@link BevelBorderUIResource} whose
158 * <code>bevelType</code> is {@link
159 * javax.swing.border.BevelBorder#RAISED}.
160 *
161 * @see javax.swing.border.BevelBorder
162 */
163 public static Border getRaisedBevelBorderUIResource()
164 {
165 /* Swing is not designed to be thread-safe, so there is no
166 * need to synchronize the access to the global variable.
167 */
168 if (raisedBevelBorderUIResource == null)
169 raisedBevelBorderUIResource = new BevelBorderUIResource(
170 BevelBorder.RAISED);
171 return raisedBevelBorderUIResource;
172 }
173
174
175 /**
176 * Returns a shared instance of {@link LineBorderUIResource} for
177 * a black, one-pixel width border.
178 *
179 * @see javax.swing.border.LineBorder
180 */
181 public static Border getBlackLineBorderUIResource()
182 {
183 /* Swing is not designed to be thread-safe, so there is no
184 * need to synchronize the access to the global variable.
185 */
186 if (blackLineBorderUIResource == null)
187 blackLineBorderUIResource = new LineBorderUIResource(Color.black);
188 return blackLineBorderUIResource;
189 }
190
191
192 /**
193 * The wrapped border.
194 */
195 private Border delegate;
196
197
198 /**
199 * Constructs a <code>BorderUIResource</code> for wrapping
200 * a <code>Border</code> object.
201 *
202 * @param delegate the border to be wrapped.
203 */
204 public BorderUIResource(Border delegate)
205 {
206 if (delegate == null)
207 throw new IllegalArgumentException();
208
209 this.delegate = delegate;
210 }
211
212
213 /**
214 * Paints the border around an enclosed component by calling
215 * the <code>paintBorder</code> method of the wrapped delegate.
216 *
217 * @param c the component whose border is to be painted.
218 * @param g the graphics for painting.
219 * @param x the horizontal position for painting the border.
220 * @param y the vertical position for painting the border.
221 * @param width the width of the available area for painting the border.
222 * @param height the height of the available area for painting the border.
223 */
224 public void paintBorder(Component c, Graphics g,
225 int x, int y, int width, int height)
226 {
227 delegate.paintBorder(c, g, x, y, width, height);
228 }
229
230
231 /**
232 * Measures the width of this border by calling the
233 * <code>getBorderInsets</code> method of the wrapped
234 * delegate.
235 *
236 * @param c the component whose border is to be measured.
237 *
238 * @return an Insets object whose <code>left</code>, <code>right</code>,
239 * <code>top</code> and <code>bottom</code> fields indicate the
240 * width of the border at the respective edge.
241 */
242 public Insets getBorderInsets(Component c)
243 {
244 return delegate.getBorderInsets(c);
245 }
246
247
248 /**
249 * Determines whether this border fills every pixel in its area
250 * when painting by calling the <code>isBorderOpaque</code>
251 * method of the wrapped delegate.
252 *
253 * @return <code>true</code> if the border is fully opaque, or
254 * <code>false</code> if some pixels of the background
255 * can shine through the border.
256 */
257 public boolean isBorderOpaque()
258 {
259 return delegate.isBorderOpaque();
260 }
261
262
263 /**
264 * A {@link javax.swing.border.BevelBorder} that also implements the
265 * {@link UIResource} marker interface. This is useful for
266 * implementing pluggable look-and-feels: When switching the current
267 * LookAndFeel, only those borders are replaced that are marked as
268 * {@link UIResource}. For this reason, a look-and-feel should
269 * always install borders that implement <code>UIResource</code>,
270 * such as the borders provided by this class.
271 *
272 * @author Brian Jones (cbj@gnu.org)
273 * @author Sascha Brawer (brawer@dandelis.ch)
274 */
275 public static class BevelBorderUIResource
276 extends BevelBorder
277 implements UIResource, Serializable
278 {
279 private static final long serialVersionUID = -1275542891108351642L;
280
281 /**
282 * Constructs a BevelBorderUIResource whose colors will be derived
283 * from the background of the enclosed component. The background
284 * color is retrieved each time the border is painted, so a border
285 * constructed by this method will automatically reflect a change
286 * to the component’s background color.
287 *
288 * <p><img src="../border/doc-files/BevelBorder-1.png"
289 * width="500" height="150"
290 * alt="[An illustration showing raised and lowered BevelBorders]" /></p>
291 *
292 * @param bevelType the desired appearance of the border. The value
293 * must be either {@link javax.swing.border.BevelBorder#RAISED}
294 * or {@link javax.swing.border.BevelBorder#LOWERED}.
295 *
296 * @throws IllegalArgumentException if <code>bevelType</code> has
297 * an unsupported value.
298 */
299 public BevelBorderUIResource(int bevelType)
300 {
301 super(bevelType);
302 }
303
304
305 /**
306 * Constructs a BevelBorderUIResource given its appearance type
307 * and two colors for its highlight and shadow.
308 *
309 * <p><img src="../border/doc-files/BevelBorder-2.png" width="500"
310 * height="150" alt="[An illustration showing BevelBorders that were
311 * constructed with this method]" /></p>
312 *
313 * @param bevelType the desired appearance of the border. The value
314 * must be either {@link javax.swing.border.BevelBorder#RAISED}
315 * or {@link javax.swing.border.BevelBorder#LOWERED}.
316 *
317 * @param highlight the color that will be used for the inner side
318 * of the highlighted edges (top and left if if
319 * <code>bevelType</code> is {@link
320 * javax.swing.border.BevelBorder#RAISED}; bottom and right
321 * otherwise). The color for the outer side is a brightened
322 * version of this color.
323 *
324 * @param shadow the color that will be used for the outer side of
325 * the shadowed edges (bottom and right if
326 * <code>bevelType</code> is {@link
327 * javax.swing.border.BevelBorder#RAISED}; top and left
328 * otherwise). The color for the inner side is a brightened
329 * version of this color.
330 *
331 * @throws IllegalArgumentException if <code>bevelType</code> has
332 * an unsupported value.
333 *
334 * @throws NullPointerException if <code>highlight</code> or
335 * <code>shadow</code> is <code>null</code>.
336 */
337 public BevelBorderUIResource(int bevelType,
338 Color highlight,
339 Color shadow)
340 {
341 super(bevelType, highlight, shadow);
342 }
343
344
345 /**
346 * Constructs a BevelBorderUIResource given its appearance type
347 * and all its colors.
348 *
349 * <p><img src="../border/doc-files/BevelBorder-3.png" width="500"
350 * height="150" alt="[An illustration showing BevelBorders that
351 * were constructed with this method]" /></p>
352 *
353 * @param bevelType the desired appearance of the border. The value
354 * must be either {@link javax.swing.border.BevelBorder#RAISED}
355 * or {@link javax.swing.border.BevelBorder#LOWERED}.
356 *
357 * @param highlightOuter the color that will be used for the outer
358 * side of the highlighted edges (top and left if
359 * <code>bevelType</code> is {@link
360 * javax.swing.border.BevelBorder#RAISED}; bottom and right
361 * otherwise).
362 *
363 * @param highlightInner the color that will be used for the inner
364 * side of the highlighted edges.
365 *
366 * @param shadowOuter the color that will be used for the outer
367 * side of the shadowed edges (bottom and right if
368 * <code>bevelType</code> is {@link
369 * javax.swing.border.BevelBorder#RAISED}; top and left
370 * otherwise).
371 *
372 * @param shadowInner the color that will be used for the inner
373 * side of the shadowed edges.
374 *
375 * @throws IllegalArgumentException if <code>bevelType</code> has
376 * an unsupported value.
377 *
378 * @throws NullPointerException if one of the passed colors
379 * is <code>null</code>.
380 */
381 public BevelBorderUIResource(int bevelType,
382 Color highlightOuter,
383 Color highlightInner,
384 Color shadowOuter,
385 Color shadowInner)
386 {
387 super(bevelType,
388 highlightOuter, highlightInner,
389 shadowOuter, shadowInner);
390 }
391 }
392
393
394 /**
395 * A {@link javax.swing.border.CompoundBorder} that also implements the
396 * {@link UIResource} marker interface. This is useful for
397 * implementing pluggable look-and-feels: When switching the current
398 * LookAndFeel, only those borders are replaced that are marked as
399 * {@link UIResource}. For this reason, a look-and-feel should
400 * always install borders that implement <code>UIResource</code>,
401 * such as the borders provided by this class.
402 *
403 * @author Brian Jones (cbj@gnu.org)
404 * @author Sascha Brawer (brawer@dandelis.ch)
405 */
406 public static class CompoundBorderUIResource
407 extends CompoundBorder
408 implements UIResource, Serializable
409 {
410 private static final long serialVersionUID = 7550017084975167341L;
411
412 /**
413 * Constructs a CompoundBorderUIResource with the specified inside
414 * and outside borders.
415 *
416 * @param outsideBorder the outside border, which is painted to the
417 * outside of both <code>insideBorder</code> and the enclosed
418 * component. It is acceptable to pass <code>null</code>, in
419 * which case no outside border is painted.
420 *
421 * @param insideBorder the inside border, which is painted to
422 * between <code>outsideBorder</code> and the enclosed
423 * component. It is acceptable to pass <code>null</code>, in
424 * which case no inside border is painted.
425 */
426 public CompoundBorderUIResource(Border outsideBorder,
427 Border insideBorder)
428 {
429 super(outsideBorder, insideBorder);
430 }
431 }
432
433
434 /**
435 * An {@link javax.swing.border.EmptyBorder} that also implements the
436 * {@link UIResource} marker interface. This is useful for
437 * implementing pluggable look-and-feels: When switching the current
438 * LookAndFeel, only those borders are replaced that are marked as
439 * {@link UIResource}. For this reason, a look-and-feel should
440 * always install borders that implement <code>UIResource</code>,
441 * such as the borders provided by this class.
442 *
443 * <p><img src="../border/doc-files/EmptyBorder-1.png"
444 * width="290" height="200"
445 * alt="[An illustration of EmptyBorder]" /></p>
446 *
447 * @author Brian Jones (cbj@gnu.org)
448 * @author Sascha Brawer (brawer@dandelis.ch)
449 */
450 public static class EmptyBorderUIResource
451 extends EmptyBorder
452 implements UIResource, Serializable
453 {
454 private static final long serialVersionUID = -4914187529340071708L;
455
456 /**
457 * Constructs an empty border given the number of pixels required
458 * on each side.
459 *
460 * @param top the number of pixels that the border will need
461 * for its top edge.
462 *
463 * @param left the number of pixels that the border will need
464 * for its left edge.
465 *
466 * @param bottom the number of pixels that the border will need
467 * for its bottom edge.
468 *
469 * @param right the number of pixels that the border will need
470 * for its right edge.
471 */
472 public EmptyBorderUIResource(int top, int left, int bottom, int right)
473 {
474 super(top, left, bottom, right);
475 }
476
477
478 /**
479 * Constructs an empty border given the number of pixels required
480 * on each side, passed in an Insets object.
481 *
482 * @param insets the Insets for the new border.
483 */
484 public EmptyBorderUIResource(Insets insets)
485 {
486 super(insets);
487 }
488 }
489
490
491 /**
492 * An {@link javax.swing.border.EtchedBorder} that also implements the
493 * {@link UIResource} marker interface. This is useful for
494 * implementing pluggable look-and-feels: When switching the current
495 * LookAndFeel, only those borders are replaced that are marked as
496 * {@link UIResource}. For this reason, a look-and-feel should
497 * always install borders that implement <code>UIResource</code>,
498 * such as the borders provided by this class.
499 *
500 * <p><img src="../border/doc-files/EtchedBorder-1.png" width="500"
501 * height="200" alt="[An illustration of the two EtchedBorder
502 * variants]" /></p>
503 *
504 * @author Brian Jones (cbj@gnu.org)
505 * @author Sascha Brawer (brawer@dandelis.ch)
506 */
507 public static class EtchedBorderUIResource
508 extends EtchedBorder
509 implements UIResource, Serializable
510 {
511 private static final long serialVersionUID = -8186391754165296656L;
512
513 /**
514 * Constructs an EtchedBorderUIResource that appears lowered into
515 * the surface. The colors will be derived from the background
516 * color of the enclosed Component when the border gets painted.
517 */
518 public EtchedBorderUIResource()
519 {
520 super();
521 }
522
523
524 /**
525 * Constructs an EtchedBorderUIResource with the specified
526 * appearance. The colors will be derived from the background
527 * color of the enclosed Component when the border gets painted.
528 *
529 * <p><img src="../border/doc-files/EtchedBorder-1.png"
530 * width="500" height="200" alt="[An illustration of the two
531 * EtchedBorder variants]" /></p>
532 *
533 * @param etchType the desired appearance of the border. The value
534 * must be either {@link javax.swing.border.EtchedBorder#RAISED}
535 * or {@link javax.swing.border.EtchedBorder#LOWERED}.
536 *
537 * @throws IllegalArgumentException if <code>etchType</code> has
538 * an unsupported value.
539 */
540 public EtchedBorderUIResource(int etchType)
541 {
542 super(etchType);
543 }
544
545
546 /**
547 * Constructs a lowered EtchedBorderUIResource, explicitly
548 * selecting the colors that will be used for highlight and
549 * shadow.
550 *
551 * @param highlight the color that will be used for painting
552 * the highlight part of the border.
553 *
554 * @param shadow the color that will be used for painting
555 * the shadow part of the border.
556 *
557 * @see EtchedBorderUIResource#EtchedBorderUIResource(int, Color, Color)
558 */
559 public EtchedBorderUIResource(Color highlight, Color shadow)
560 {
561 super(highlight, shadow);
562 }
563
564
565 /**
566 * Constructs an EtchedBorderUIResource with the specified
567 * appearance, explicitly selecting the colors that will be used
568 * for highlight and shadow.
569 *
570 * <p><img src="../border/doc-files/EtchedBorder-2.png" width="500"
571 * height="200" alt="[An illustration that shows which pixels get
572 * painted in what color]" /></p>
573 *
574 * @param etchType the desired appearance of the border. The value
575 * must be either {@link javax.swing.border.EtchedBorder#RAISED}
576 * or {@link javax.swing.border.EtchedBorder#LOWERED}.
577 *
578 * @param highlight the color that will be used for painting
579 * the highlight part of the border.
580 *
581 * @param shadow the color that will be used for painting
582 * the shadow part of the border.
583 *
584 * @throws IllegalArgumentException if <code>etchType</code> has
585 * an unsupported value.
586 */
587 public EtchedBorderUIResource(int etchType,
588 Color highlight, Color shadow)
589 {
590 super(etchType, highlight, shadow);
591 }
592 }
593
594
595 /**
596 * A {@link javax.swing.border.LineBorder} that also implements the
597 * {@link UIResource} marker interface. This is useful for
598 * implementing pluggable look-and-feels: When switching the current
599 * LookAndFeel, only those borders are replaced that are marked as
600 * {@link UIResource}. For this reason, a look-and-feel should
601 * always install borders that implement <code>UIResource</code>,
602 * such as the borders provided by this class.
603 *
604 * <p><img src="../border/doc-files/LineBorder-1.png" width="500"
605 * height="200" alt="[An illustration of two LineBorders]" /></p>
606 *
607 * @author Brian Jones (cbj@gnu.org)
608 * @author Sascha Brawer (brawer@dandelis.ch)
609 */
610 public static class LineBorderUIResource
611 extends LineBorder
612 implements UIResource, Serializable
613 {
614 private static final long serialVersionUID = -6171232338180172310L;
615
616 /**
617 * Constructs a LineBorderUIResource given its color. The border
618 * will be one pixel thick and have plain corners.
619 *
620 * @param color the color for drawing the border.
621 */
622 public LineBorderUIResource(Color color)
623 {
624 super(color);
625 }
626
627
628 /**
629 * Constructs a LineBorder given its color and thickness. The
630 * border will have plain corners.
631 *
632 * @param color the color for drawing the border.
633 * @param thickness the width of the line in pixels.
634 */
635 public LineBorderUIResource(Color color, int thickness)
636 {
637 super(color, thickness);
638 }
639
640
641 /* Note: Since JDK1.3, javax.swing.border.LineBorder also has a
642 * constructor which accepts a value for the roundedCorners
643 * property. However, as of JDK1.4.1, the LineBorderUIResource
644 * subclass does not have a corresponding constructor.
645 *
646 * A request for enhancing the Swing API has been filed with Sun:
647 * http://developer.java.sun.com/developer/bugParade/bugs/4879999.html
648 */
649 }
650
651
652 /**
653 * A {@link javax.swing.border.MatteBorder} that also implements the
654 * {@link UIResource} marker interface. This is useful for
655 * implementing pluggable look-and-feels: When switching the current
656 * LookAndFeel, only those borders are replaced that are marked as
657 * {@link UIResource}. For this reason, a look-and-feel should
658 * always install borders that implement <code>UIResource</code>,
659 * such as the borders provided by this class.
660 *
661 * <p><img src="../border/doc-files/MatteBorder-1.png" width="500"
662 * height="150" alt="[An illustration of two MatteBorders]" /></p>
663 *
664 * @author Brian Jones (cbj@gnu.org)
665 * @author Sascha Brawer (brawer@dandelis.ch)
666 */
667 public static class MatteBorderUIResource
668 extends MatteBorder
669 implements UIResource, Serializable
670 {
671 private static final long serialVersionUID = -8107923147541851122L;
672
673 /**
674 * Constructs a MatteBorderUIResource given the width on each side
675 * and a fill color.
676 *
677 * <p><img src="../border/doc-files/MatteBorder-2.png" width="500"
678 * height="150" alt="[A picture of a MatteBorder made by this
679 * constructor]" /></p>
680 *
681 * @param top the width of the border at its top edge.
682 * @param left the width of the border at its left edge.
683 * @param bottom the width of the border at its bottom edge.
684 * @param right the width of the border at its right edge.
685 * @param color the color for filling the border.
686 */
687 public MatteBorderUIResource(int top, int left,
688 int bottom, int right,
689 Color color)
690 {
691 super(top, left, bottom, right, color);
692 }
693
694
695 /**
696 * Constructs a MatteBorderUIResource given the width on each side
697 * and an icon for tiling the border area.
698 *
699 * <p><img src="../border/doc-files/MatteBorder-4.png" width="500"
700 * height="150" alt="[A picture of a MatteBorder made by this
701 * constructor]" /></p>
702 *
703 * @param top the width of the border at its top edge.
704 * @param left the width of the border at its left edge.
705 * @param bottom the width of the border at its bottom edge.
706 * @param right the width of the border at its right edge.
707 * @param tileIcon an icon for tiling the border area.
708 */
709 public MatteBorderUIResource(int top, int left,
710 int bottom, int right,
711 Icon tileIcon)
712 {
713 super(top, left, bottom, right, tileIcon);
714 }
715
716
717 /**
718 * Constructs a MatteBorderUIResource given an icon for tiling the
719 * border area. The icon width is used for the border insets at
720 * the left and right edge, the icon height for the top and bottom
721 * edge.
722 *
723 * <p><img src="../border/doc-files/MatteBorder-6.png" width="500"
724 * height="150" alt="[A picture of a MatteBorder made by this
725 * constructor]" /></p>
726 *
727 * @param tileIcon an icon for tiling the border area.
728 */
729 public MatteBorderUIResource(Icon tileIcon)
730 {
731 super(tileIcon);
732 }
733 }
734
735
736 /**
737 * A {@link javax.swing.border.TitledBorder} that also implements the
738 * {@link UIResource} marker interface. This is useful for
739 * implementing pluggable look-and-feels: When switching the current
740 * LookAndFeel, only those borders are replaced that are marked as
741 * {@link UIResource}. For this reason, a look-and-feel should
742 * always install borders that implement <code>UIResource</code>,
743 * such as the borders provided by this class.
744 *
745 * @author Brian Jones (cbj@gnu.org)
746 * @author Sascha Brawer (brawer@dandelis.ch)
747 */
748 public static class TitledBorderUIResource
749 extends TitledBorder
750 implements UIResource, Serializable
751 {
752 private static final long serialVersionUID = 7667113547406407427L;
753
754 /**
755 * Constructs a TitledBorderUIResource given the text of its title.
756 *
757 * @param title the title text, or <code>null</code> to use no
758 * title text.
759 */
760 public TitledBorderUIResource(String title)
761 {
762 super(title);
763 }
764
765
766 /**
767 * Constructs an initially untitled TitledBorderUIResource
768 * given another border.
769 *
770 * @param border the border underneath the title, or
771 * <code>null</code> to use a default from
772 * the current look and feel.
773 */
774 public TitledBorderUIResource(Border border)
775 {
776 super(border);
777 }
778
779
780 /**
781 * Constructs a TitledBorder given its border and title text.
782 *
783 * @param border the border underneath the title, or
784 * <code>null</code> to use a default from
785 * the current look and feel.
786 *
787 * @param title the title text, or <code>null</code>
788 * to use no title text.
789 */
790 public TitledBorderUIResource(Border border, String title)
791 {
792 super(border, title);
793 }
794
795
796 /**
797 * Constructs a TitledBorderUIResource given its border, title
798 * text, horizontal alignment, and vertical position.
799 *
800 * @param border the border underneath the title, or
801 * <code>null</code> to use a default
802 * from the current look and feel.
803 *
804 * @param title the title text, or <code>null</code>
805 * to use no title text.
806 *
807 * @param titleJustification the horizontal alignment of the title
808 * text in relation to the border. The value must be one of
809 * {@link javax.swing.border.TitledBorder#LEFT},
810 * {@link javax.swing.border.TitledBorder#CENTER},
811 * {@link javax.swing.border.TitledBorder#RIGHT},
812 * {@link javax.swing.border.TitledBorder#LEADING},
813 * {@link javax.swing.border.TitledBorder#TRAILING}, or
814 * {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
815 *
816 * @param titlePosition the vertical position of the title text
817 * in relation to the border. The value must be one of
818 * {@link javax.swing.border.TitledBorder#ABOVE_TOP},
819 * {@link javax.swing.border.TitledBorder#TOP},
820 * {@link javax.swing.border.TitledBorder#BELOW_TOP},
821 * {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
822 * {@link javax.swing.border.TitledBorder#BOTTOM},
823 * {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
824 * or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
825 *
826 * @throws IllegalArgumentException if <code>titleJustification</code>
827 * or <code>titlePosition</code> have an unsupported value.
828 */
829 public TitledBorderUIResource(Border border, String title,
830 int titleJustification,
831 int titlePosition)
832 {
833 super(border, title, titleJustification, titlePosition);
834 }
835
836
837 /**
838 * Constructs a TitledBorder given its border, title text,
839 * horizontal alignment, vertical position, and font.
840 *
841 * @param border the border underneath the title, or
842 * <code>null</code> to use a default
843 * from the current look and feel.
844 *
845 * @param title the title text, or <code>null</code>
846 * to use no title text.
847 *
848 * @param titleJustification the horizontal alignment of the title
849 * text in relation to the border. The value must be one of
850 * {@link javax.swing.border.TitledBorder#LEFT},
851 * {@link javax.swing.border.TitledBorder#CENTER},
852 * {@link javax.swing.border.TitledBorder#RIGHT},
853 * {@link javax.swing.border.TitledBorder#LEADING},
854 * {@link javax.swing.border.TitledBorder#TRAILING}, or
855 * {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
856 *
857 * @param titlePosition the vertical position of the title text
858 * in relation to the border. The value must be one of
859 * {@link javax.swing.border.TitledBorder#ABOVE_TOP},
860 * {@link javax.swing.border.TitledBorder#TOP},
861 * {@link javax.swing.border.TitledBorder#BELOW_TOP},
862 * {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
863 * {@link javax.swing.border.TitledBorder#BOTTOM},
864 * {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
865 * or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
866 *
867 * @param titleFont the font for the title text, or <code>null</code>
868 * to use a default from the current look and feel.
869 *
870 * @throws IllegalArgumentException if <code>titleJustification</code>
871 * or <code>titlePosition</code> have an unsupported value.
872 */
873 public TitledBorderUIResource(Border border, String title,
874 int titleJustification,
875 int titlePosition,
876 Font titleFont)
877 {
878 super(border, title, titleJustification, titlePosition,
879 titleFont);
880 }
881
882
883 /**
884 * Constructs a TitledBorder given its border, title text,
885 * horizontal alignment, vertical position, font, and color.
886 *
887 * @param border the border underneath the title, or
888 * <code>null</code> to use a default
889 * from the current look and feel.
890 *
891 * @param title the title text, or <code>null</code>
892 * to use no title text.
893 *
894 * @param titleJustification the horizontal alignment of the title
895 * text in relation to the border. The value must be one of
896 * {@link javax.swing.border.TitledBorder#LEFT},
897 * {@link javax.swing.border.TitledBorder#CENTER},
898 * {@link javax.swing.border.TitledBorder#RIGHT},
899 * {@link javax.swing.border.TitledBorder#LEADING},
900 * {@link javax.swing.border.TitledBorder#TRAILING}, or
901 * {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
902 *
903 * @param titlePosition the vertical position of the title text
904 * in relation to the border. The value must be one of
905 * {@link javax.swing.border.TitledBorder#ABOVE_TOP},
906 * {@link javax.swing.border.TitledBorder#TOP},
907 * {@link javax.swing.border.TitledBorder#BELOW_TOP},
908 * {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
909 * {@link javax.swing.border.TitledBorder#BOTTOM},
910 * {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
911 * or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
912 *
913 * @param titleFont the font for the title text, or <code>null</code>
914 * to use a default from the current look and feel.
915 *
916 * @param titleColor the color for the title text, or <code>null</code>
917 * to use a default from the current look and feel.
918 *
919 * @throws IllegalArgumentException if <code>titleJustification</code>
920 * or <code>titlePosition</code> have an unsupported value.
921 */
922 public TitledBorderUIResource(Border border, String title,
923 int titleJustification, int titlePosition,
924 Font titleFont, Color titleColor)
925 {
926 super(border, title, titleJustification, titlePosition,
927 titleFont, titleColor);
928 }
929 }
930 }