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 = ""; 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