📄 borderlayout.java
字号:
* @param target The container to calculate the minimum size for. * * @return The minimum size of the container */ public Dimension minimumLayoutSize(Container target) { return calcSize(target, MIN); } /** * Returns the preferred size of the specified container using this layout. * * @param target The container to calculate the preferred size for. * * @return The preferred size of the container */ public Dimension preferredLayoutSize(Container target) { return calcSize(target, PREF); } /** * Returns the maximum size of the specified container using this layout. * * @param target The container to calculate the maximum size for. * * @return The maximum size of the container */ public Dimension maximumLayoutSize(Container target) { return calcSize(target, MAX); } /** * Returns the X axis alignment, which is a <code>float</code> indicating * where along the X axis this container wishs to position its layout. * 0 indicates align to the left, 1 indicates align to the right, and 0.5 * indicates align to the center. * * @param parent The parent container. * * @return The X alignment value. */ public float getLayoutAlignmentX(Container parent) { return 0.5F; } /** * Returns the Y axis alignment, which is a <code>float</code> indicating * where along the Y axis this container wishs to position its layout. * 0 indicates align to the top, 1 indicates align to the bottom, and 0.5 * indicates align to the center. * * @param parent The parent container. * * @return The Y alignment value. */ public float getLayoutAlignmentY(Container parent) { return 0.5F; } /** * Instructs this object to discard any layout information it might * have cached. * * @param parent The parent container. */ public void invalidateLayout(Container parent) { // Nothing to do here. } /** * Lays out the specified container according to the constraints * in this object. * * @param target The container to lay out. */ public void layoutContainer(Container target) { synchronized (target.getTreeLock ()) { Insets i = target.getInsets(); ComponentOrientation orient = target.getComponentOrientation (); boolean left_to_right = orient.isLeftToRight (); Component my_north = north; Component my_east = east; Component my_south = south; Component my_west = west; // Note that we currently don't handle vertical layouts. Neither // does JDK 1.3. if (firstLine != null) my_north = firstLine; if (lastLine != null) my_south = lastLine; if (firstItem != null) { if (left_to_right) my_west = firstItem; else my_east = firstItem; } if (lastItem != null) { if (left_to_right) my_east = lastItem; else my_west = lastItem; } Dimension c = calcCompSize(center, PREF); Dimension n = calcCompSize(my_north, PREF); Dimension s = calcCompSize(my_south, PREF); Dimension e = calcCompSize(my_east, PREF); Dimension w = calcCompSize(my_west, PREF); int targetWidth = target.getWidth(); int targetHeight = target.getHeight(); /* <-> hgap <-> hgap +----------------------------+ } |t | } i.top | +----------------------+ | --- y1 } | |n | | | +----------------------+ | } vgap | +---+ +----------+ +---+ | --- y2 } } | |w | |c | |e | | } hh | +---+ +----------+ +---+ | } vgap } | +----------------------+ | --- y3 } | |s | | | +----------------------+ | } | | } i.bottom +----------------------------+ } |x1 |x2 |x3 <----------------------> <--> ww <--> i.left i.right */ int x1 = i.left; int x2 = x1 + w.width + (w.width == 0 ? 0 : hgap); int x3; if (targetWidth <= i.right + e.width) x3 = x2 + w.width + (w.width == 0 ? 0 : hgap); else x3 = targetWidth - i.right - e.width; int ww = targetWidth - i.right - i.left; int y1 = i.top; int y2 = y1 + n.height + (n.height == 0 ? 0 : vgap); int midh = Math.max(e.height, Math.max(w.height, c.height)); int y3; if (targetHeight <= i.bottom + s.height) y3 = y2 + midh + vgap; else y3 = targetHeight - i.bottom - s.height; int hh = y3-y2-(s.height == 0 ? 0 : vgap); setBounds(center, x2, y2, x3-x2-(w.width == 0 ? 0 : hgap), hh); setBounds(my_north, x1, y1, ww, n.height); setBounds(my_south, x1, y3, ww, s.height); setBounds(my_west, x1, y2, w.width, hh); setBounds(my_east, x3, y2, e.width, hh); } } /** * Returns a string representation of this layout manager. * * @return A string representation of this object. */ public String toString() { return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]"; } /** * This is a convenience method to set the bounds on a component. * If the indicated component is null, nothing is done. */ private void setBounds(Component comp, int x, int y, int w, int h) { if (comp == null) return; comp.setBounds(x, y, w, h); } private Dimension calcCompSize(Component comp, int what) { if (comp == null || !comp.isVisible()) return new Dimension(0, 0); if (what == MIN) return comp.getMinimumSize(); else if (what == MAX) return comp.getMaximumSize(); return comp.getPreferredSize(); } /** * This is a helper function used to compute the various sizes for * this layout. */ private Dimension calcSize(Container target, int what) { synchronized (target.getTreeLock ()) { Insets ins = target.getInsets(); ComponentOrientation orient = target.getComponentOrientation (); boolean left_to_right = orient.isLeftToRight (); Component my_north = north; Component my_east = east; Component my_south = south; Component my_west = west; // Note that we currently don't handle vertical layouts. Neither // does JDK 1.3. if (firstLine != null) my_north = firstLine; if (lastLine != null) my_south = lastLine; if (firstItem != null) { if (left_to_right) my_west = firstItem; else my_east = firstItem; } if (lastItem != null) { if (left_to_right) my_east = lastItem; else my_west = lastItem; } Dimension ndim = calcCompSize(my_north, what); Dimension sdim = calcCompSize(my_south, what); Dimension edim = calcCompSize(my_east, what); Dimension wdim = calcCompSize(my_west, what); Dimension cdim = calcCompSize(center, what); int width = edim.width + cdim.width + wdim.width + (hgap * 2); // Check for overflow. if (width < edim.width || width < cdim.width || width < cdim.width) width = Integer.MAX_VALUE; if (ndim.width > width) width = ndim.width; if (sdim.width > width) width = sdim.width; width += (ins.left + ins.right); int height = edim.height; if (cdim.height > height) height = cdim.height; if (wdim.height > height) height = wdim.height; int addedHeight = height + (ndim.height + sdim.height + (vgap * 2) + ins.top + ins.bottom); // Check for overflow. if (addedHeight < height) height = Integer.MAX_VALUE; else height = addedHeight; return(new Dimension(width, height)); } } /** * Return the component at the indicated location, or null if no component * is at that location. The constraints argument must be one of the * location constants specified by this class. * @param constraints the location * @return the component at that location, or null * @throws IllegalArgumentException if the constraints argument is not * recognized * @since 1.5 */ public Component getLayoutComponent(Object constraints) { if (constraints == CENTER) return center; if (constraints == NORTH) return north; if (constraints == EAST) return east; if (constraints == SOUTH) return south; if (constraints == WEST) return west; if (constraints == PAGE_START) return firstLine; if (constraints == PAGE_END) return lastLine; if (constraints == LINE_START) return firstItem; if (constraints == LINE_END) return lastItem; throw new IllegalArgumentException("constraint " + constraints + " is not recognized"); } /** * Return the component at the specified location, which must be one * of the absolute constants such as CENTER or SOUTH. The container's * orientation is used to map this location to the correct corresponding * component, so for instance in a right-to-left container, a request * for the EAST component could return the LINE_END component. This will * return null if no component is available at the given location. * @param container the container whose orientation is used * @param constraints the absolute location of the component * @return the component at the location, or null * @throws IllegalArgumentException if the constraint is not recognized */ public Component getLayoutComponent(Container container, Object constraints) { ComponentOrientation orient = container.getComponentOrientation(); if (constraints == CENTER) return center; // Note that we don't support vertical layouts. if (constraints == NORTH) return north; if (constraints == SOUTH) return south; if (constraints == WEST) { // Note that relative layout takes precedence. if (orient.isLeftToRight()) return firstItem == null ? west : firstItem; return lastItem == null ? west : lastItem; } if (constraints == EAST) { // Note that relative layout takes precedence. if (orient.isLeftToRight()) return lastItem == null ? east : lastItem; return firstItem == null ? east : firstItem; } throw new IllegalArgumentException("constraint " + constraints + " is not recognized"); } /** * Return the constraint corresponding to a component in this layout. * If the component is null, or is not in this layout, returns null. * Otherwise, this will return one of the constraint constants defined * in this class. * @param c the component * @return the constraint, or null * @since 1.5 */ public Object getConstraints(Component c) { if (c == null) return null; if (c == center) return CENTER; if (c == north) return NORTH; if (c == east) return EAST; if (c == south) return SOUTH; if (c == west) return WEST; if (c == firstLine) return PAGE_START; if (c == lastLine) return PAGE_END; if (c == firstItem) return LINE_START; if (c == lastItem) return LINE_END; return null; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -