package com.knutejohnson.demos;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GridBagTester extends JPanel implements ActionListener {
private static final String[] colorNames = { "Black","Blue","Cyan",
"Green","Gray","Magenta","Orange","Pink","Red","Yellow" };
private static final Color[] colors = { Color.BLACK,Color.BLUE,Color.CYAN,
Color.GREEN,Color.GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,
Color.RED,Color.YELLOW };
private static final String instructionStr =
"
" +
"- Use the 'Edit' menu to select a component by color." +
"
- Use the sub-menus to 'Add', 'Remove', set 'Constraints' on,
" +
"or set the 'Sizes' of a component." +
" - Right click on a component to popup its menu." +
"
- The 'View' menu (not available with JApplet) has options to
" +
"pack the frame or set its size." +
" - Click and drag the small box in the lower right corner to
" +
"resize the panel." +
"
";
private static final String aboutStr =
"GridBagTester\nWritten by: Knute Johnson\nUpdated 4 Aug 2008";
private final JPanel[] panels = new JPanel[colors.length];
private final GridBagLayout gbl;
private final GridBagConstraints defaultConstraints;
public final JMenu file,edit,view,samples,help;
private final JMenu[] panelMenus;
private final JMenuItem quit,pack,six40x480,clear,instructions,about;
private final JMenuItem layout1, layout2, layout3;
private boolean mouseFlag;
public GridBagTester() {
setBorder(BorderFactory.createLineBorder(Color.BLACK));
// create menus for use by top level container
file = new JMenu("File");
file.setMnemonic(KeyEvent.VK_F);
edit = new JMenu("Edit");
edit.setMnemonic(KeyEvent.VK_E);
view = new JMenu("View");
view.setMnemonic(KeyEvent.VK_V);
samples = new JMenu("Samples");
samples.setMnemonic(KeyEvent.VK_S);
help = new JMenu("Help");
help.setMnemonic(KeyEvent.VK_H);
quit = new JMenuItem("Quit");
quit.addActionListener(this);
file.add(quit);
pack = new JMenuItem("Pack");
pack.addActionListener(this);
view.add(pack);
six40x480 = new JMenuItem("640x480");
six40x480.addActionListener(this);
view.add(six40x480);
layout1 = new JMenuItem("Layout 1");
layout1.addActionListener(this);
samples.add(layout1);
layout2 = new JMenuItem("Layout 2");
layout2.addActionListener(this);
samples.add(layout2);
layout3 = new JMenuItem("Layout 3");
layout3.addActionListener(this);
samples.add(layout3);
instructions = new JMenuItem("Instructions");
instructions.addActionListener(this);
help.add(instructions);
about = new JMenuItem("About");
about.addActionListener(this);
help.add(about);
panelMenus = new JMenu[colors.length];
for (int i=0; i cont.getWidth() - 5)
x = cont.getWidth() - 5;
if (y > cont.getHeight() - 5)
y = cont.getHeight() - 5;
setSize(x + 5,y + 5);
validate();
}
}
};
addMouseListener(ma);
addMouseMotionListener(mma);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(getWidth()-9,getHeight()-9,8,8);
}
public void actionPerformed(ActionEvent ae) {
String ac = ae.getActionCommand();
if (ac.equals("Quit"))
System.exit(0);
else if (ac.equals("Pack")) {
Container cont = getTopLevelAncestor();
if (cont instanceof JFrame)
((JFrame)cont).pack();
} else if (ac.equals("640x480")) {
Container cont = getTopLevelAncestor();
if (cont instanceof JFrame)
((JFrame)cont).setSize(640,480);
} else if (ac.equals("Clear")) {
removeAll();
validate();
repaint();
} else if (ac.equals("Instructions")) {
JOptionPane.showMessageDialog(this,instructionStr);
} else if (ac.equals("About")) {
JOptionPane.showMessageDialog(this,aboutStr);
} else if (ac.equals("Layout 1")) {
removeAll();
// reset preferred size
for (int i=0; i<4; i++)
panels[i].setPreferredSize(new Dimension(80,60));
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
add(panels[0],c);
c.gridx = 1;
add(panels[1],c);
c.gridx = 2;
add(panels[2],c);
c.gridx = 0; c.gridwidth = 3; c.ipady = 40;
c.fill = GridBagConstraints.HORIZONTAL;
add(panels[3],c);
c.gridx = 1; c.gridwidth = 2; c.ipady = -20; c.insets.top = 10;
add(panels[4],c);
validate();
repaint();
} else if (ac.equals("Layout 2")) {
removeAll();
// reset preferred size
for (int i=0; i<4; i++)
panels[i].setPreferredSize(new Dimension(80,60));
GridBagConstraints c = new GridBagConstraints();
c.gridx = c.gridy = 0; c.weightx = c.weighty = 1.0;
c.anchor = GridBagConstraints.NORTHWEST;
add(panels[0],c);
c.gridx = 2; c.anchor = GridBagConstraints.NORTHEAST;
add(panels[1],c);
c.gridx = c.gridy = 1; c.anchor = GridBagConstraints.CENTER;
add(panels[2],c);
c.gridx = 0; c.gridy = 2; c.anchor = GridBagConstraints.SOUTHWEST;
add(panels[3],c);
c.gridx = 2; c.anchor = GridBagConstraints.SOUTHEAST;
add(panels[4],c);
validate();
repaint();
} else if (ac.equals("Layout 3")) {
removeAll();
// reset preferred size
for (int i=0; i<4; i++)
panels[i].setPreferredSize(new Dimension(80,60));
GridBagConstraints c = new GridBagConstraints();
c.gridx =0; c.gridy = GridBagConstraints.RELATIVE;
c.weightx = c.weighty = 1.0;
c.anchor = GridBagConstraints.NORTH;
add(panels[0],c);
c.anchor = GridBagConstraints.SOUTH;
add(panels[1],c);
c.anchor = GridBagConstraints.NORTH;
add(panels[2],c);
c.anchor = GridBagConstraints.SOUTH;
add(panels[3],c);
validate();
repaint();
}
if (ae.getSource() instanceof IndexedJMenuItem) {
int menuIndex = ((IndexedJMenuItem)ae.getSource()).getIndex();
if (ac.equals("Add")) {
if (!panels[menuIndex].isDisplayable()) {
add(panels[menuIndex],defaultConstraints);
validate();
repaint();
}
} else if (ac.equals("Remove")) {
if (panels[menuIndex].isDisplayable()) {
remove(panels[menuIndex]);
validate();
repaint();
}
} else if (ac.equals("Constraints")) {
GridBagConstraints c = ConstraintsDialog.show(
panels[menuIndex],colorNames[menuIndex],
gbl.getConstraints(panels[menuIndex]));
if (c != null) {
gbl.setConstraints(panels[menuIndex],c);
panels[menuIndex].revalidate();
}
} else if (ac.equals("Sizes")) {
Dimension[] dim = SizesDialog.show(panels[menuIndex],
colorNames[menuIndex],panels[menuIndex].getMinimumSize(),
panels[menuIndex].getPreferredSize(),
panels[menuIndex].getMaximumSize());
if (dim != null) {
panels[menuIndex].setMinimumSize(dim[0]);
panels[menuIndex].setPreferredSize(dim[1]);
panels[menuIndex].setMaximumSize(dim[2]);
panels[menuIndex].revalidate();
}
}
}
}
static class IndexedJMenuItem extends JMenuItem {
private final int index;
public IndexedJMenuItem(String text, int index) {
super(text);
this.index = index;
}
public int getIndex() {
return index;
}
}
static class PopupListener extends MouseAdapter {
private final JPopupMenu popup;
public PopupListener(JPopupMenu popup) {
this.popup = popup;
}
public void mousePressed(MouseEvent me) {
if (me.isPopupTrigger())
popup.show(me.getComponent(),me.getX(),me.getY());
}
public void mouseReleased(MouseEvent me) {
if (me.isPopupTrigger())
popup.show(me.getComponent(),me.getX(),me.getY());
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("GridBagTester");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagTester gbt = new GridBagTester();
f.getContentPane().add(gbt);
JMenuBar mb = new JMenuBar();
f.setJMenuBar(mb);
mb.add(gbt.file);
mb.add(gbt.edit);
mb.add(gbt.view);
mb.add(gbt.samples);
mb.add(gbt.help);
f.setSize(640,480);
f.setVisible(true);
}
});
}
}
package com.knutejohnson.demos;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ConstraintsDialog extends JDialog implements ActionListener {
final String[] gridXYChoices =
{ "RELATIVE","0","1","2","3","4","5","6","7","8","9","10" };
final String[] gridWHChoices =
{ "REMAINDER","RELATIVE","1","2","3","4","5","6","7","8","9","10" };
final String[] anchorChoices = { "CENTER","NORTH","NORTHEAST","EAST",
"SOUTHEAST","SOUTH","SOUTHWEST","WEST","NORTHWEST" };
final String[] fillChoices = { "NONE","HORIZONTAL","VERTICAL","BOTH" };
final String[] insetsTip = { "Top","Left","Bottom","Right" } ;
final JComboBox gridx, gridy, gridwidth, gridheight, fill, anchor;
final JTextField weightx, weighty, insets[], ipadx, ipady;
final JButton updateButton, cancelButton;
private boolean flag;
public ConstraintsDialog(String title) {
super((Dialog)null,title,true);
Container cp = getContentPane();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
setVisible(false);
}
});
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(2,2,2,2);
c.weightx = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0; c.gridy = 0;
cp.add(new JLabel("gridx"),c);
++c.gridx;
gridx = new JComboBox(gridXYChoices);
cp.add(gridx,c);
c.gridx = 0; ++c.gridy;
cp.add(new JLabel("gridy"),c);
++c.gridx;
gridy = new JComboBox(gridXYChoices);
cp.add(gridy,c);
c.gridx = 0; ++c.gridy;
cp.add(new JLabel("gridwidth"),c);
++c.gridx;
gridwidth = new JComboBox(gridWHChoices);
cp.add(gridwidth,c);
c.gridx = 0; ++c.gridy;
cp.add(new JLabel("gridheight"),c);
++c.gridx;
gridheight = new JComboBox(gridWHChoices);
cp.add(gridheight,c);
c.gridx = 0; ++c.gridy;
cp.add(new JLabel("weightx"),c);
++c.gridx;
weightx = new JTextField(4);
cp.add(weightx,c);
c.gridx = 0; ++c.gridy;
cp.add(new JLabel("weighty"),c);
++c.gridx;
weighty = new JTextField(4);
cp.add(weighty,c);
c.gridx = 2; c.gridy = 0;
cp.add(new JLabel("anchor"),c);
++c.gridx;
anchor = new JComboBox(anchorChoices);
cp.add(anchor,c);
c.gridx = 2; ++c.gridy;
cp.add(new JLabel("fill"),c);
++c.gridx;
fill = new JComboBox(fillChoices);
cp.add(fill,c);
c.gridx = 2; ++c.gridy;
cp.add(new JLabel("insets"),c);
++c.gridx;
JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER,0,0));
insets = new JTextField[4];
for (int i=0; i