1 /* 2 * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package java.awt; 26 27 /** 28 * The <code>GridBagConstraints</code> class specifies constraints 29 * for components that are laid out using the 30 * <code>GridBagLayout</code> class. 31 * 32 * @author Doug Stein 33 * @author Bill Spitzak (orignial NeWS & OLIT implementation) 34 * @see java.awt.GridBagLayout 35 * @since JDK1.0 36 */ 37 public class GridBagConstraints implements Cloneable, java.io.Serializable { 38 39 /** 40 * Specifies that this component is the next-to-last component in its 41 * column or row (<code>gridwidth</code>, <code>gridheight</code>), 42 * or that this component be placed next to the previously added 43 * component (<code>gridx</code>, <code>gridy</code>). 44 * @see java.awt.GridBagConstraints#gridwidth 45 * @see java.awt.GridBagConstraints#gridheight 46 * @see java.awt.GridBagConstraints#gridx 47 * @see java.awt.GridBagConstraints#gridy 48 */ 49 public static final int RELATIVE = -1; 50 51 /** 52 * Specifies that this component is the 53 * last component in its column or row. 54 */ 55 public static final int REMAINDER = 0; 56 57 /** 58 * Do not resize the component. 59 */ 60 public static final int NONE = 0; 61 62 /** 63 * Resize the component both horizontally and vertically. 64 */ 65 public static final int BOTH = 1; 66 67 /** 68 * Resize the component horizontally but not vertically. 69 */ 70 public static final int HORIZONTAL = 2; 71 72 /** 73 * Resize the component vertically but not horizontally. 74 */ 75 public static final int VERTICAL = 3; 76 77 /** 78 * Put the component in the center of its display area. 79 */ 80 public static final int CENTER = 10; 81 82 /** 83 * Put the component at the top of its display area, 84 * centered horizontally. 85 */ 86 public static final int NORTH = 11; 87 88 /** 89 * Put the component at the top-right corner of its display area. 90 */ 91 public static final int NORTHEAST = 12; 92 93 /** 94 * Put the component on the right side of its display area, 95 * centered vertically. 96 */ 97 public static final int EAST = 13; 98 99 /** 100 * Put the component at the bottom-right corner of its display area. 101 */ 102 public static final int SOUTHEAST = 14; 103 104 /** 105 * Put the component at the bottom of its display area, centered 106 * horizontally. 107 */ 108 public static final int SOUTH = 15; 109 110 /** 111 * Put the component at the bottom-left corner of its display area. 112 */ 113 public static final int SOUTHWEST = 16; 114 115 /** 116 * Put the component on the left side of its display area, 117 * centered vertically. 118 */ 119 public static final int WEST = 17; 120 121 /** 122 * Put the component at the top-left corner of its display area. 123 */ 124 public static final int NORTHWEST = 18; 125 126 /** 127 * Place the component centered along the edge of its display area 128 * associated with the start of a page for the current 129 * {@code ComponentOrientation}. Equal to NORTH for horizontal 130 * orientations. 131 */ 132 public static final int PAGE_START = 19; 133 134 /** 135 * Place the component centered along the edge of its display area 136 * associated with the end of a page for the current 137 * {@code ComponentOrientation}. Equal to SOUTH for horizontal 138 * orientations. 139 */ 140 public static final int PAGE_END = 20; 141 142 /** 143 * Place the component centered along the edge of its display area where 144 * lines of text would normally begin for the current 145 * {@code ComponentOrientation}. Equal to WEST for horizontal, 146 * left-to-right orientations and EAST for horizontal, right-to-left 147 * orientations. 148 */ 149 public static final int LINE_START = 21; 150 151 /** 152 * Place the component centered along the edge of its display area where 153 * lines of text would normally end for the current 154 * {@code ComponentOrientation}. Equal to EAST for horizontal, 155 * left-to-right orientations and WEST for horizontal, right-to-left 156 * orientations. 157 */ 158 public static final int LINE_END = 22; 159 160 /** 161 * Place the component in the corner of its display area where 162 * the first line of text on a page would normally begin for the current 163 * {@code ComponentOrientation}. Equal to NORTHWEST for horizontal, 164 * left-to-right orientations and NORTHEAST for horizontal, right-to-left 165 * orientations. 166 */ 167 public static final int FIRST_LINE_START = 23; 168 169 /** 170 * Place the component in the corner of its display area where 171 * the first line of text on a page would normally end for the current 172 * {@code ComponentOrientation}. Equal to NORTHEAST for horizontal, 173 * left-to-right orientations and NORTHWEST for horizontal, right-to-left 174 * orientations. 175 */ 176 public static final int FIRST_LINE_END = 24; 177 178 /** 179 * Place the component in the corner of its display area where 180 * the last line of text on a page would normally start for the current 181 * {@code ComponentOrientation}. Equal to SOUTHWEST for horizontal, 182 * left-to-right orientations and SOUTHEAST for horizontal, right-to-left 183 * orientations. 184 */ 185 public static final int LAST_LINE_START = 25; 186 187 /** 188 * Place the component in the corner of its display area where 189 * the last line of text on a page would normally end for the current 190 * {@code ComponentOrientation}. Equal to SOUTHEAST for horizontal, 191 * left-to-right orientations and SOUTHWEST for horizontal, right-to-left 192 * orientations. 193 */ 194 public static final int LAST_LINE_END = 26; 195 196 /** 197 * Possible value for the <code>anchor</code> field. Specifies 198 * that the component should be horizontally centered and 199 * vertically aligned along the baseline of the prevailing row. 200 * If the component does not have a baseline it will be vertically 201 * centered. 202 * 203 * @since 1.6 204 */ 205 public static final int BASELINE = 0x100; 206 207 /** 208 * Possible value for the <code>anchor</code> field. Specifies 209 * that the component should be horizontally placed along the 210 * leading edge. For components with a left-to-right orientation, 211 * the leading edge is the left edge. Vertically the component is 212 * aligned along the baseline of the prevailing row. If the 213 * component does not have a baseline it will be vertically 214 * centered. 215 * 216 * @since 1.6 217 */ 218 public static final int BASELINE_LEADING = 0x200; 219 220 /** 221 * Possible value for the <code>anchor</code> field. Specifies 222 * that the component should be horizontally placed along the 223 * trailing edge. For components with a left-to-right 224 * orientation, the trailing edge is the right edge. Vertically 225 * the component is aligned along the baseline of the prevailing 226 * row. If the component does not have a baseline it will be 227 * vertically centered. 228 * 229 * @since 1.6 230 */ 231 public static final int BASELINE_TRAILING = 0x300; 232 233 /** 234 * Possible value for the <code>anchor</code> field. Specifies 235 * that the component should be horizontally centered. Vertically 236 * the component is positioned so that its bottom edge touches 237 * the baseline of the starting row. If the starting row does not 238 * have a baseline it will be vertically centered. 239 * 240 * @since 1.6 241 */ 242 public static final int ABOVE_BASELINE = 0x400; 243 244 /** 245 * Possible value for the <code>anchor</code> field. Specifies 246 * that the component should be horizontally placed along the 247 * leading edge. For components with a left-to-right orientation, 248 * the leading edge is the left edge. Vertically the component is 249 * positioned so that its bottom edge touches the baseline of the 250 * starting row. If the starting row does not have a baseline it 251 * will be vertically centered. 252 * 253 * @since 1.6 254 */ 255 public static final int ABOVE_BASELINE_LEADING = 0x500; 256 257 /** 258 * Possible value for the <code>anchor</code> field. Specifies 259 * that the component should be horizontally placed along the 260 * trailing edge. For components with a left-to-right 261 * orientation, the trailing edge is the right edge. Vertically 262 * the component is positioned so that its bottom edge touches 263 * the baseline of the starting row. If the starting row does not 264 * have a baseline it will be vertically centered. 265 * 266 * @since 1.6 267 */ 268 public static final int ABOVE_BASELINE_TRAILING = 0x600; 269 270 /** 271 * Possible value for the <code>anchor</code> field. Specifies 272 * that the component should be horizontally centered. Vertically 273 * the component is positioned so that its top edge touches the 274 * baseline of the starting row. If the starting row does not 275 * have a baseline it will be vertically centered. 276 * 277 * @since 1.6 278 */ 279 public static final int BELOW_BASELINE = 0x700; 280 281 /** 282 * Possible value for the <code>anchor</code> field. Specifies 283 * that the component should be horizontally placed along the 284 * leading edge. For components with a left-to-right orientation, 285 * the leading edge is the left edge. Vertically the component is 286 * positioned so that its top edge touches the baseline of the 287 * starting row. If the starting row does not have a baseline it 288 * will be vertically centered. 289 * 290 * @since 1.6 291 */ 292 public static final int BELOW_BASELINE_LEADING = 0x800; 293 294 /** 295 * Possible value for the <code>anchor</code> field. Specifies 296 * that the component should be horizontally placed along the 297 * trailing edge. For components with a left-to-right 298 * orientation, the trailing edge is the right edge. Vertically 299 * the component is positioned so that its top edge touches the 300 * baseline of the starting row. If the starting row does not 301 * have a baseline it will be vertically centered. 302 * 303 * @since 1.6 304 */ 305 public static final int BELOW_BASELINE_TRAILING = 0x900; 306 307 /** 308 * Specifies the cell containing the leading edge of the component's 309 * display area, where the first cell in a row has <code>gridx=0</code>. 310 * The leading edge of a component's display area is its left edge for 311 * a horizontal, left-to-right container and its right edge for a 312 * horizontal, right-to-left container. 313 * The value 314 * <code>RELATIVE</code> specifies that the component be placed 315 * immediately following the component that was added to the container 316 * just before this component was added. 317 * <p> 318 * The default value is <code>RELATIVE</code>. 319 * <code>gridx</code> should be a non-negative value. 320 * @serial 321 * @see #clone() 322 * @see java.awt.GridBagConstraints#gridy 323 * @see java.awt.ComponentOrientation 324 */ 325 public int gridx; 326 327 /** 328 * Specifies the cell at the top of the component's display area, 329 * where the topmost cell has <code>gridy=0</code>. The value 330 * <code>RELATIVE</code> specifies that the component be placed just 331 * below the component that was added to the container just before 332 * this component was added. 333 * <p> 334 * The default value is <code>RELATIVE</code>. 335 * <code>gridy</code> should be a non-negative value. 336 * @serial 337 * @see #clone() 338 * @see java.awt.GridBagConstraints#gridx 339 */ 340 public int gridy; 341 342 /** 343 * Specifies the number of cells in a row for the component's 344 * display area. 345 * <p> 346 * Use <code>REMAINDER</code> to specify that the component's 347 * display area will be from <code>gridx</code> to the last 348 * cell in the row. 349 * Use <code>RELATIVE</code> to specify that the component's 350 * display area will be from <code>gridx</code> to the next 351 * to the last one in its row. 352 * <p> 353 * <code>gridwidth</code> should be non-negative and the default 354 * value is 1. 355 * @serial 356 * @see #clone() 357 * @see java.awt.GridBagConstraints#gridheight 358 */ 359 public int gridwidth; 360 361 /** 362 * Specifies the number of cells in a column for the component's 363 * display area. 364 * <p> 365 * Use <code>REMAINDER</code> to specify that the component's 366 * display area will be from <code>gridy</code> to the last 367 * cell in the column. 368 * Use <code>RELATIVE</code> to specify that the component's 369 * display area will be from <code>gridy</code> to the next 370 * to the last one in its column. 371 * <p> 372 * <code>gridheight</code> should be a non-negative value and the 373 * default value is 1. 374 * @serial 375 * @see #clone() 376 * @see java.awt.GridBagConstraints#gridwidth 377 */ 378 public int gridheight; 379 380 /** 381 * Specifies how to distribute extra horizontal space. 382 * <p> 383 * The grid bag layout manager calculates the weight of a column to 384 * be the maximum <code>weightx</code> of all the components in a 385 * column. If the resulting layout is smaller horizontally than the area 386 * it needs to fill, the extra space is distributed to each column in 387 * proportion to its weight. A column that has a weight of zero receives 388 * no extra space. 389 * <p> 390 * If all the weights are zero, all the extra space appears between 391 * the grids of the cell and the left and right edges. 392 * <p> 393 * The default value of this field is <code>0</code>. 394 * <code>weightx</code> should be a non-negative value. 395 * @serial 396 * @see #clone() 397 * @see java.awt.GridBagConstraints#weighty 398 */ 399 public double weightx; 400 401 /** 402 * Specifies how to distribute extra vertical space. 403 * <p> 404 * The grid bag layout manager calculates the weight of a row to be 405 * the maximum <code>weighty</code> of all the components in a row. 406 * If the resulting layout is smaller vertically than the area it 407 * needs to fill, the extra space is distributed to each row in 408 * proportion to its weight. A row that has a weight of zero receives no 409 * extra space. 410 * <p> 411 * If all the weights are zero, all the extra space appears between 412 * the grids of the cell and the top and bottom edges. 413 * <p> 414 * The default value of this field is <code>0</code>. 415 * <code>weighty</code> should be a non-negative value. 416 * @serial 417 * @see #clone() 418 * @see java.awt.GridBagConstraints#weightx 419 */ 420 public double weighty; 421 422 /** 423 * This field is used when the component is smaller than its 424 * display area. It determines where, within the display area, to 425 * place the component. 426 * <p> There are three kinds of possible values: orientation 427 * relative, baseline relative and absolute. Orientation relative 428 * values are interpreted relative to the container's component 429 * orientation property, baseline relative values are interpreted 430 * relative to the baseline and absolute values are not. The 431 * absolute values are: 432 * <code>CENTER</code>, <code>NORTH</code>, <code>NORTHEAST</code>, 433 * <code>EAST</code>, <code>SOUTHEAST</code>, <code>SOUTH</code>, 434 * <code>SOUTHWEST</code>, <code>WEST</code>, and <code>NORTHWEST</code>. 435 * The orientation relative values are: <code>PAGE_START</code>, 436 * <code>PAGE_END</code>, 437 * <code>LINE_START</code>, <code>LINE_END</code>, 438 * <code>FIRST_LINE_START</code>, <code>FIRST_LINE_END</code>, 439 * <code>LAST_LINE_START</code> and <code>LAST_LINE_END</code>. The 440 * baseline relative values are: 441 * <code>BASELINE</code>, <code>BASELINE_LEADING</code>, 442 * <code>BASELINE_TRAILING</code>, 443 * <code>ABOVE_BASELINE</code>, <code>ABOVE_BASELINE_LEADING</code>, 444 * <code>ABOVE_BASELINE_TRAILING</code>, 445 * <code>BELOW_BASELINE</code>, <code>BELOW_BASELINE_LEADING</code>, 446 * and <code>BELOW_BASELINE_TRAILING</code>. 447 * The default value is <code>CENTER</code>. 448 * @serial 449 * @see #clone() 450 * @see java.awt.ComponentOrientation 451 */ 452 public int anchor; 453 454 /** 455 * This field is used when the component's display area is larger 456 * than the component's requested size. It determines whether to 457 * resize the component, and if so, how. 458 * <p> 459 * The following values are valid for <code>fill</code>: 460 * 461 * <ul> 462 * <li> 463 * <code>NONE</code>: Do not resize the component. 464 * <li> 465 * <code>HORIZONTAL</code>: Make the component wide enough to fill 466 * its display area horizontally, but do not change its height. 467 * <li> 468 * <code>VERTICAL</code>: Make the component tall enough to fill its 469 * display area vertically, but do not change its width. 470 * <li> 471 * <code>BOTH</code>: Make the component fill its display area 472 * entirely. 473 * </ul> 474 * <p> 475 * The default value is <code>NONE</code>. 476 * @serial 477 * @see #clone() 478 */ 479 public int fill; 480 481 /** 482 * This field specifies the external padding of the component, the 483 * minimum amount of space between the component and the edges of its 484 * display area. 485 * <p> 486 * The default value is <code>new Insets(0, 0, 0, 0)</code>. 487 * @serial 488 * @see #clone() 489 */ 490 public Insets insets; 491 492 /** 493 * This field specifies the internal padding of the component, how much 494 * space to add to the minimum width of the component. The width of 495 * the component is at least its minimum width plus 496 * <code>ipadx</code> pixels. 497 * <p> 498 * The default value is <code>0</code>. 499 * @serial 500 * @see #clone() 501 * @see java.awt.GridBagConstraints#ipady 502 */ 503 public int ipadx; 504 505 /** 506 * This field specifies the internal padding, that is, how much 507 * space to add to the minimum height of the component. The height of 508 * the component is at least its minimum height plus 509 * <code>ipady</code> pixels. 510 * <p> 511 * The default value is 0. 512 * @serial 513 * @see #clone() 514 * @see java.awt.GridBagConstraints#ipadx 515 */ 516 public int ipady; 517 518 /** 519 * Temporary place holder for the x coordinate. 520 * @serial 521 */ 522 int tempX; 523 /** 524 * Temporary place holder for the y coordinate. 525 * @serial 526 */ 527 int tempY; 528 /** 529 * Temporary place holder for the Width of the component. 530 * @serial 531 */ 532 int tempWidth; 533 /** 534 * Temporary place holder for the Height of the component. 535 * @serial 536 */ 537 int tempHeight; 538 /** 539 * The minimum width of the component. It is used to calculate 540 * <code>ipady</code>, where the default will be 0. 541 * @serial 542 * @see #ipady 543 */ 544 int minWidth; 545 /** 546 * The minimum height of the component. It is used to calculate 547 * <code>ipadx</code>, where the default will be 0. 548 * @serial 549 * @see #ipadx 550 */ 551 int minHeight; 552 553 // The following fields are only used if the anchor is 554 // one of BASELINE, BASELINE_LEADING or BASELINE_TRAILING. 555 // ascent and descent include the insets and ipady values. 556 transient int ascent; 557 transient int descent; 558 transient Component.BaselineResizeBehavior baselineResizeBehavior; 559 // The folllowing two fields are used if the baseline type is 560 // CENTER_OFFSET. 561 // centerPadding is either 0 or 1 and indicates if 562 // the height needs to be padded by one when calculating where the 563 // baseline lands 564 transient int centerPadding; 565 // Where the baseline lands relative to the center of the component. 566 transient int centerOffset; 567 568 /* 569 * JDK 1.1 serialVersionUID 570 */ 571 private static final long serialVersionUID = -1000070633030801713L; 572 573 /** 574 * Creates a <code>GridBagConstraint</code> object with 575 * all of its fields set to their default value. 576 */ 577 public GridBagConstraints () { 578 gridx = RELATIVE; 579 gridy = RELATIVE; 580 gridwidth = 1; 581 gridheight = 1; 582 583 weightx = 0; 584 weighty = 0; 585 anchor = CENTER; 586 fill = NONE; 587 588 insets = new Insets(0, 0, 0, 0); 589 ipadx = 0; 590 ipady = 0; 591 } 592 593 /** 594 * Creates a <code>GridBagConstraints</code> object with 595 * all of its fields set to the passed-in arguments. 596 * 597 * Note: Because the use of this constructor hinders readability 598 * of source code, this constructor should only be used by 599 * automatic source code generation tools. 600 * 601 * @param gridx The initial gridx value. 602 * @param gridy The initial gridy value. 603 * @param gridwidth The initial gridwidth value. 604 * @param gridheight The initial gridheight value. 605 * @param weightx The initial weightx value. 606 * @param weighty The initial weighty value. 607 * @param anchor The initial anchor value. 608 * @param fill The initial fill value. 609 * @param insets The initial insets value. 610 * @param ipadx The initial ipadx value. 611 * @param ipady The initial ipady value. 612 * 613 * @see java.awt.GridBagConstraints#gridx 614 * @see java.awt.GridBagConstraints#gridy 615 * @see java.awt.GridBagConstraints#gridwidth 616 * @see java.awt.GridBagConstraints#gridheight 617 * @see java.awt.GridBagConstraints#weightx 618 * @see java.awt.GridBagConstraints#weighty 619 * @see java.awt.GridBagConstraints#anchor 620 * @see java.awt.GridBagConstraints#fill 621 * @see java.awt.GridBagConstraints#insets 622 * @see java.awt.GridBagConstraints#ipadx 623 * @see java.awt.GridBagConstraints#ipady 624 * 625 * @since 1.2 626 */ 627 public GridBagConstraints(int gridx, int gridy, 628 int gridwidth, int gridheight, 629 double weightx, double weighty, 630 int anchor, int fill, 631 Insets insets, int ipadx, int ipady) { 632 this.gridx = gridx; 633 this.gridy = gridy; 634 this.gridwidth = gridwidth; 635 this.gridheight = gridheight; 636 this.fill = fill; 637 this.ipadx = ipadx; 638 this.ipady = ipady; 639 this.insets = insets; 640 this.anchor = anchor; 641 this.weightx = weightx; 642 this.weighty = weighty; 643 } 644 645 /** 646 * Creates a copy of this grid bag constraint. 647 * @return a copy of this grid bag constraint 648 */ 649 public Object clone () { 650 try { 651 GridBagConstraints c = (GridBagConstraints)super.clone(); 652 c.insets = (Insets)insets.clone(); 653 return c; 654 } catch (CloneNotSupportedException e) { 655 // this shouldn't happen, since we are Cloneable 656 throw new InternalError(e); 657 } 658 } 659 660 boolean isVerticallyResizable() { 661 return (fill == BOTH || fill == VERTICAL); 662 } 663 }