Решил выложить здесь свои наработки по работе с весьма тяжелым менеджером выравнивания - 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));
Комментариев нет:
Отправить комментарий