package ilarkesto.swing; import ilarkesto.io.IO; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; public class PanelBuilder { public static void main(String[] args) { PanelBuilder pb = new PanelBuilder(); pb.setBackgroundImage(IO.loadImage(new File( "g:/home/wko/eclipse-workspace/asistanto/src/main/resources/img/bg.jpg"))); pb.add(new JButton("Button 1")).span(2); pb.add(new JButton("Button 2")); pb.add(new JButton("Button 3")).nl(); pb.add(new JButton("Button 4")); pb.add(new JButton("Button 5")); JPanel panel = pb.toPanel(); Swing.showInJFrame(panel); } private List<Cell> cells = new ArrayList<Cell>(); private Cell lastCell; private GridBagConstraints defaultConstraints = new GridBagConstraints(); private Border border; private BufferedImage backgroundImage; private boolean opaque = false; private Dimension preferredSize; private Color background; public PanelBuilder() { defaultConstraints.weightx = 1; } public PanelBuilder setupAsButtonMenu(String title) { setDefaultPadding(2, 2, 2, 2); setDefaultFillToHorizontal(); if (title != null) setBorder(new TitledBorder(new EtchedBorder(), title)); return this; } @SuppressWarnings("unchecked") public <C extends Component> Cell<C> add(C component) { lastCell = new Cell<C>(component); cells.add(lastCell); return lastCell; } // public Cell<JButton> add(AView.Button button) { // return add(button.toJButton()); // } public Cell<JLabel> addEmpty() { return add(""); } public Cell<JLabel> add(String label) { return add(new JLabel(label)); } public void nl() { if (lastCell == null) return; lastCell.constraints.gridwidth = GridBagConstraints.REMAINDER; } public PanelBuilder setBackground(Color background) { this.background = background; this.opaque = true; return this; } public PanelBuilder setPreferredSize(Dimension preferredSize) { this.preferredSize = preferredSize; return this; } public PanelBuilder setOpaque(boolean opaque) { this.opaque = opaque; return this; } public PanelBuilder setBackgroundImage(BufferedImage backgroundImage) { this.backgroundImage = backgroundImage; return this; } public PanelBuilder setBorder(Border border) { this.border = border; return this; } public PanelBuilder setDefaultWeightX(double value) { defaultConstraints.weightx = value; return this; } public PanelBuilder setDefaultWeightY(double value) { defaultConstraints.weightx = value; return this; } public PanelBuilder setDefaultAnchorToNorthWest() { defaultConstraints.anchor = GridBagConstraints.NORTHWEST; return this; } public PanelBuilder setDefaultAnchorToNorth() { defaultConstraints.anchor = GridBagConstraints.NORTH; return this; } public PanelBuilder setDefaultPadding(int top, int bottom, int left, int right) { defaultConstraints.insets = new Insets(top, left, bottom, right); return this; } public PanelBuilder setDefaultFillToHorizontal() { defaultConstraints.fill = GridBagConstraints.HORIZONTAL; return this; } public PanelBuilder setDefaultFillToBoth() { defaultConstraints.fill = GridBagConstraints.BOTH; return this; } public JPanel toPanel() { GridBagLayout layout = new GridBagLayout(); JPanel panel = backgroundImage == null ? new JPanel(layout) : new MyPanel(layout, backgroundImage); for (Cell cell : cells) { layout.addLayoutComponent(cell.component, cell.constraints); panel.add(cell.component); } if (border != null) panel.setBorder(border); if (preferredSize != null) panel.setPreferredSize(preferredSize); if (background != null) panel.setBackground(background); panel.setOpaque(opaque); return panel; } public class Cell<C extends Component> { private C component; private GridBagConstraints constraints; public Cell(C component) { if (component == null) throw new NullPointerException("component"); this.component = component; constraints = (GridBagConstraints) defaultConstraints.clone(); } public Cell setAnchorToCenter() { constraints.anchor = GridBagConstraints.CENTER; return this; } public Cell setAnchorToNorthEast() { constraints.anchor = GridBagConstraints.NORTHEAST; return this; } public Cell setAnchorToEast() { constraints.anchor = GridBagConstraints.EAST; return this; } public Cell setAnchorToWest() { constraints.anchor = GridBagConstraints.WEST; return this; } public Cell setAnchorToNorthWest() { constraints.anchor = GridBagConstraints.NORTHWEST; return this; } public Cell setFillToHorizontal() { constraints.fill = GridBagConstraints.HORIZONTAL; return this; } public Cell setFillToVertical() { constraints.fill = GridBagConstraints.VERTICAL; return this; } public Cell setFillToBoth() { constraints.fill = GridBagConstraints.BOTH; return this; } public Cell setFillToNone() { constraints.fill = GridBagConstraints.NONE; return this; } public Cell setPadding(int top, int bottom, int left, int right) { constraints.insets = new Insets(top, left, bottom, right); return this; } public Cell setWeightX(double value) { constraints.weightx = value; return this; } public Cell setWeightY(double value) { constraints.weighty = value; return this; } public Cell span(int columns) { constraints.gridwidth = columns; return this; } public void nl() { PanelBuilder.this.nl(); } public C getComponent() { return component; } } class MyPanel extends JPanel { private BufferedImage backgroundImage; public MyPanel(LayoutManager layout, BufferedImage backgroundImage) { super(layout); this.backgroundImage = backgroundImage; } @Override public void paint(Graphics g) { if (backgroundImage != null) { g.drawImage(backgroundImage, 0, 0, getBackground(), null); } super.paint(g); } } }