package open.dolphin.helper; import java.awt.*; import javax.swing.*; /** * @author Kazushi Minagawa Digital Globe, Inc. * */ public final class GridBagBuilder { private static final int CMP_HGAP = 7; private static final int CMP_VGAP = 7; private static final int TITLE_SPACE_TOP = 0; private static final int TITLE_SPACE_LEFT = 0; private static final int TITLE_SPACE_BOTTOM = 10; private static final int TITLE_SPACE_RIGHT = 0; private JPanel container; private GridBagConstraints c; private JPanel product; private int cmpSpaceH = CMP_HGAP; private int cmpSpaceV = CMP_VGAP; private int titleSpaceTop = TITLE_SPACE_TOP; private int titleSpaceLeft = TITLE_SPACE_LEFT; private int titleSpaceBottom = TITLE_SPACE_BOTTOM; private int titleSpaceRight = TITLE_SPACE_RIGHT; public GridBagBuilder() { container = new JPanel(new GridBagLayout()); c = new GridBagConstraints(); product = container; } public GridBagBuilder(String title) { this(); setTitle(title); } public JPanel getProduct() { return product; } /** * タイトルボーダを設定する。 * @param title */ public void setTitle(String title) { if (title != null) { product = new JPanel(new BorderLayout()); product.setBorder(BorderFactory.createTitledBorder(title)); container.setBorder(BorderFactory.createEmptyBorder(getTitleSpaceTop(), getTitleSpaceLeft(), getTitleSpaceBottom(), getTitleSpaceRight())); product.add(container, BorderLayout.CENTER); } } /** * 座標(x, y) anchor の位置に長さ一のコンポーネントを追加する。 * @param c * @param x * @param y * @param anchor */ public void add(Component c, int x, int y, int anchor) { add(c, x, y, 1, 1, anchor); } /** * 座標(x, y) anchor の位置にスパン(width, height)のコンポーネントを追加する。 * @param cmp * @param x * @param y * @param width * @param height * @param anchor */ public void add(Component cmp, int x, int y, int width, int height, int anchor) { int top = (y == 0) ? 0 : getCmpSpaceV(); int left = (x == 0) ? 0 : getCmpSpaceH(); c.gridx = x; c.gridy = y; c.gridwidth = width; c.gridheight = height; c.fill = GridBagConstraints.NONE; // 大きくしない !!! c.anchor = anchor; // X,Y 方向とも2番目以降の部品は水平方向に 7, // 垂直方向に 5 ピクセルの間隔をあける if (top != 0 || left != 0) { c.insets = new Insets(top, left, 0, 0); // top left bottom right } ((GridBagLayout)container.getLayout()).setConstraints(cmp, c); container.add(cmp); } /** * 座標(x, y)の位置にスパン1で重み(wx, wy)のコンポーネントを追加する。 * @param cmp * @param x * @param y * @param fill * @param wx * @param wy */ public void add(Component cmp, int x, int y, int fill, double wx, double wy) { add(cmp, x, y, 1, 1, fill, wx, wy); } /** * 座標(x, y)の位置にスパン(width, height)で重み(wx, wy)のコンポーネントを追加する。 * @param cmp * @param x * @param y * @param width * @param height * @param fill * @param wx * @param wy */ public void add(Component cmp, int x, int y, int width, int height, int fill, double wx, double wy) { int top = (y == 0) ? 0 : getCmpSpaceV(); int left = (x == 0) ? 0 : getCmpSpaceH(); //GridBagConstraints c = new GridBagConstraints(); c.gridx = x; c.gridy = y; c.gridwidth = width; c.gridheight = height; c.fill = fill; c.weightx = wx; c.weighty = wy; if (top != 0 || left != 0) { c.insets = new Insets(top, left, 0, 0); // top left bottom right } ((GridBagLayout)container.getLayout()).setConstraints(cmp, c); container.add(cmp); } public void addGlue(int x, int y, int fill) { add(new JLabel(""), x, y, 1, 1, fill, 1.0, 1.0); } public void addHGlue(int x, int y) { add(new JLabel(""), x, y, 1, 1, GridBagConstraints.HORIZONTAL, 1.0, 1.0); } public void addVGlue(int x, int y) { add(new JLabel(""), x, y, 1, 1, GridBagConstraints.VERTICAL, 1.0, 1.0); } public void setCmpSpaceH(int cmpSpaceH) { this.cmpSpaceH = cmpSpaceH; } public int getCmpSpaceH() { return cmpSpaceH; } public void setCmpSpaceV(int cmpSpaceV) { this.cmpSpaceV = cmpSpaceV; } public int getCmpSpaceV() { return cmpSpaceV; } public void setTitleSpaceTop(int titleSpaceTop) { this.titleSpaceTop = titleSpaceTop; } public int getTitleSpaceTop() { return titleSpaceTop; } public void setTitleSpaceLeft(int titleSpaceLeft) { this.titleSpaceLeft = titleSpaceLeft; } public int getTitleSpaceLeft() { return titleSpaceLeft; } public void setTitleSpaceBottom(int titleSpaceBottom) { this.titleSpaceBottom = titleSpaceBottom; } public int getTitleSpaceBottom() { return titleSpaceBottom; } public void setTitleSpaceRight(int titleSpaceRight) { this.titleSpaceRight = titleSpaceRight; } public int getTitleSpaceRight() { return titleSpaceRight; } }