вторник, 8 июля 2008 г.

Маленькие классы: GBC писать куда проще, чем GridBagConstraints

Здравствуйте, уважаемые.

Решил выложить здесь свои наработки по работе с весьма тяжелым менеджером выравнивания - GridBagLayout. Тяжелым не потому, что он запутанный, а потому что писать надо много а выхлоп маленький. К решению меня подтолкнула тема обсуждения лучшего менеджера выравнивания в Java

w1nd, конечно же, меня переоценил, предположив, что я решил сделать сплав из FormLayout и GridBagLayout. С другой стороны, FormLayout повлиял на результат модификации GridBagLayout.

3 цели, которые я преследовал:
1. Писать сокращенную форму GridBagConstraints
2. Т.к. ячейки в столбце, как правило, имеют одни и те же параметры, необходим механизм "Задать параметры 1 раз и распространить на все ячейки столбца"
3. Цепочечный стиль, описанный уважаемым Се ля ви

И вот они классы:

package ru.vingrad.platon.swing;

import java.awt.*;

public class GBC extends GridBagConstraints {
public GBC() {
}

public GBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) {
super(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
}

public GBC(int gridx, int gridy) {
this.gridx = gridx;
this.gridy = gridy;
}

public GBC(int gridx, int gridy, int gridwidth, int gridheight) {
this.gridx = gridx;
this.gridy = gridy;
this.gridwidth = gridwidth;
this.gridheight = gridheight;
}

public GBC gridX(int gridx) {
this.gridx = gridx;
return this;
}

public GBC gridY(int gridy) {
this.gridy = gridy;
return this;
}

public GBC gridWidth(int gridwidth) {
this.gridwidth = gridwidth;
return this;
}

public GBC gridHeight(int gridheight) {
this.gridheight = gridheight;
return this;
}

public GBC weightX(double weightx) {
this.weightx = weightx;
return this;
}

public GBC weightY(double weighty) {
this.weighty = weighty;
return this;
}

public GBC anchor(int anchor) {
this.anchor = anchor;
return this;
}

public GBC fill(int fill) {
this.fill = fill;
return this;
}

public GBC ipadX(int ipadx) {
this.ipadx = ipadx;
return this;
}

public GBC ipadY(int ipady) {
this.ipady = ipady;
return this;
}

public GBC insets(Insets insets) {
this.insets = insets;
return this;
}
}


package ru.vingrad.platon.swing;

import javax.swing.*;
import java.awt.*;

public class GBCUtil {
public int defaultGridX;
public int defaultGridY;
public int defaultGridWidth = 1;
public int defaultGridHeight = 1;
public double defaultWeightX;
public double defaultWeightY;
public int defaultAnchor = GBC.CENTER;
public int defaultFill = GBC.NONE;
public Insets defaultInsets = new Insets(2, 2, 2, 2);
public int defaultPadX;
public int defaultPadY;

public GBCUtil() {
}

public GBCUtil(int defaultGridX, int defaultGridY, int defaultGridWidth, int defaultGridHeight, double defaultWeightX, double defaultWeightY, int defaultAnchor, int defaultFill, Insets defaultInsets, int defaultPadX, int defaultPadY) {
this.defaultGridX = defaultGridX;
this.defaultGridY = defaultGridY;
this.defaultGridWidth = defaultGridWidth;
this.defaultGridHeight = defaultGridHeight;
this.defaultWeightX = defaultWeightX;
this.defaultWeightY = defaultWeightY;
this.defaultAnchor = defaultAnchor;
this.defaultFill = defaultFill;
this.defaultInsets = defaultInsets;
this.defaultPadX = defaultPadX;
this.defaultPadY = defaultPadY;
}

public GBC buildGBC() {
return new GBC(defaultGridX, defaultGridY, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
}

public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor,
int fill, Insets insets, int ipadx, int ipady) {
return new GBC(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
}

public GBC buildGBC(int gridx, int gridy) {
return new GBC(gridx, gridy, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
}

public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight) {
return new GBC(gridx, gridy, gridwidth, gridheight, defaultWeightX, defaultWeightY,
defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
}

public GBCUtil gridX(int gridX) {
defaultGridX = gridX;
return this;
}

public GBCUtil gridY(int gridY) {
defaultGridY = gridY;
return this;
}

public GBCUtil gridWidth(int defaultGridWidth) {
this.defaultGridWidth = defaultGridWidth;
return this;
}

public GBCUtil gridHeight(int defaultGridHeight) {
this.defaultGridHeight = defaultGridHeight;
return this;
}

public GBCUtil weightX(double defaultWeightX) {
this.defaultWeightX = defaultWeightX;
return this;
}

public GBCUtil weightY(double defaultWeightY) {
this.defaultWeightY = defaultWeightY;
return this;
}

public GBCUtil anchor(int defaultAnchor) {
this.defaultAnchor = defaultAnchor;
return this;
}

public GBCUtil fill(int defaultFill) {
this.defaultFill = defaultFill;
return this;
}

public GBCUtil insets(Insets defaultInsets) {
this.defaultInsets = defaultInsets;
return this;
}

public GBCUtil padX(int defaultPadX) {
this.defaultPadX = defaultPadX;
return this;
}

public GBCUtil padY(int defaultPadY) {
this.defaultPadY = defaultPadY;
return this;
}

}


Пример использования:

  JPanel panel = new JPanel(new GridBagLayout());
GBCUtil util =
new GBCUtil().anchor(GBC.WEST).insets(new Insets(2, 2, 2, 2));
panel.add(
new JLabel("Label1"), util.buildGBC(0, 0));
panel.add(
new JLabel("Label2"), util.buildGBC(0, 1));
panel.add(
new JLabel("Label3"), util.buildGBC(0, 2));
panel.add(
new JButton("..."), util.buildGBC(2, 2));
util.weightX(
1).anchor(GBC.CENTER).fill(GBC.HORIZONTAL);
panel.add(
new JTextField(), util.buildGBC(1, 0, 2, 1));
panel.add(
new JTextField(), util.buildGBC(1, 1));
panel.add(
new JTextField(), util.buildGBC(1, 2));

Комментариев нет: