1 /*
2 * Copyright 1995-2008 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26 package java.awt;
27
28 import java.awt.geom.Dimension2D;
29 import java.beans.Transient;
30
31 /**
32 * The <code>Dimension</code> class encapsulates the width and
33 * height of a component (in integer precision) in a single object.
34 * The class is
35 * associated with certain properties of components. Several methods
36 * defined by the <code>Component</code> class and the
37 * <code>LayoutManager</code> interface return a
38 * <code>Dimension</code> object.
39 * <p>
40 * Normally the values of <code>width</code>
41 * and <code>height</code> are non-negative integers.
42 * The constructors that allow you to create a dimension do
43 * not prevent you from setting a negative value for these properties.
44 * If the value of <code>width</code> or <code>height</code> is
45 * negative, the behavior of some methods defined by other objects is
46 * undefined.
47 *
48 * @author Sami Shaio
49 * @author Arthur van Hoff
50 * @see java.awt.Component
51 * @see java.awt.LayoutManager
52 * @since 1.0
53 */
54 public class Dimension extends Dimension2D implements java.io.Serializable {
55
56 /**
57 * The width dimension; negative values can be used.
58 *
59 * @serial
60 * @see #getSize
61 * @see #setSize
62 * @since 1.0
63 */
64 public int width;
65
66 /**
67 * The height dimension; negative values can be used.
68 *
69 * @serial
70 * @see #getSize
71 * @see #setSize
72 * @since 1.0
73 */
74 public int height;
75
76 /*
77 * JDK 1.1 serialVersionUID
78 */
79 private static final long serialVersionUID = 4723952579491349524L;
80
81 /**
82 * Initialize JNI field and method IDs
83 */
84 private static native void initIDs();
85
86 static {
87 /* ensure that the necessary native libraries are loaded */
88 Toolkit.loadLibraries();
89 if (!GraphicsEnvironment.isHeadless()) {
90 initIDs();
91 }
92 }
93
94 /**
95 * Creates an instance of <code>Dimension</code> with a width
96 * of zero and a height of zero.
97 */
98 public Dimension() {
99 this(0, 0);
100 }
101
102 /**
103 * Creates an instance of <code>Dimension</code> whose width
104 * and height are the same as for the specified dimension.
105 *
106 * @param d the specified dimension for the
107 * <code>width</code> and
108 * <code>height</code> values
109 */
110 public Dimension(Dimension d) {
111 this(d.width, d.height);
112 }
113
114 /**
115 * Constructs a <code>Dimension</code> and initializes
116 * it to the specified width and specified height.
117 *
118 * @param width the specified width
119 * @param height the specified height
120 */
121 public Dimension(int width, int height) {
122 this.width = width;
123 this.height = height;
124 }
125
126 /**
127 * {@inheritDoc}
128 * @since 1.2
129 */
130 public double getWidth() {
131 return width;
132 }
133
134 /**
135 * {@inheritDoc}
136 * @since 1.2
137 */
138 public double getHeight() {
139 return height;
140 }
141
142 /**
143 * Sets the size of this <code>Dimension</code> object to
144 * the specified width and height in double precision.
145 * Note that if <code>width</code> or <code>height</code>
146 * are larger than <code>Integer.MAX_VALUE</code>, they will
147 * be reset to <code>Integer.MAX_VALUE</code>.
148 *
149 * @param width the new width for the <code>Dimension</code> object
150 * @param height the new height for the <code>Dimension</code> object
151 * @since 1.2
152 */
153 public void setSize(double width, double height) {
154 this.width = (int) Math.ceil(width);
155 this.height = (int) Math.ceil(height);
156 }
157
158 /**
159 * Gets the size of this <code>Dimension</code> object.
160 * This method is included for completeness, to parallel the
161 * <code>getSize</code> method defined by <code>Component</code>.
162 *
163 * @return the size of this dimension, a new instance of
164 * <code>Dimension</code> with the same width and height
165 * @see java.awt.Dimension#setSize
166 * @see java.awt.Component#getSize
167 * @since 1.1
168 */
169 @Transient
170 public Dimension getSize() {
171 return new Dimension(width, height);
172 }
173
174 /**
175 * Sets the size of this <code>Dimension</code> object to the specified size.
176 * This method is included for completeness, to parallel the
177 * <code>setSize</code> method defined by <code>Component</code>.
178 * @param d the new size for this <code>Dimension</code> object
179 * @see java.awt.Dimension#getSize
180 * @see java.awt.Component#setSize
181 * @since 1.1
182 */
183 public void setSize(Dimension d) {
184 setSize(d.width, d.height);
185 }
186
187 /**
188 * Sets the size of this <code>Dimension</code> object
189 * to the specified width and height.
190 * This method is included for completeness, to parallel the
191 * <code>setSize</code> method defined by <code>Component</code>.
192 *
193 * @param width the new width for this <code>Dimension</code> object
194 * @param height the new height for this <code>Dimension</code> object
195 * @see java.awt.Dimension#getSize
196 * @see java.awt.Component#setSize
197 * @since 1.1
198 */
199 public void setSize(int width, int height) {
200 this.width = width;
201 this.height = height;
202 }
203
204 /**
205 * Checks whether two dimension objects have equal values.
206 */
207 public boolean equals(Object obj) {
208 if (obj instanceof Dimension) {
209 Dimension d = (Dimension)obj;
210 return (width == d.width) && (height == d.height);
211 }
212 return false;
213 }
214
215 /**
216 * Returns the hash code for this <code>Dimension</code>.
217 *
218 * @return a hash code for this <code>Dimension</code>
219 */
220 public int hashCode() {
221 int sum = width + height;
222 return sum * (sum + 1)/2 + width;
223 }
224
225 /**
226 * Returns a string representation of the values of this
227 * <code>Dimension</code> object's <code>height</code> and
228 * <code>width</code> fields. This method is intended to be used only
229 * for debugging purposes, and the content and format of the returned
230 * string may vary between implementations. The returned string may be
231 * empty but may not be <code>null</code>.
232 *
233 * @return a string representation of this <code>Dimension</code>
234 * object
235 */
236 public String toString() {
237 return getClass().getName() + "[width=" + width + ",height=" + height + "]";
238 }
239 }