import java.awt.*; import java.awt.event.*; public class GUIWindow extends Frame implements ActionListener, ItemListener { boolean inAnApplet = true; final String FILEDIALOGMENUITEM = "File dialog box"; List list; Choice choice; Button button; Checkbox checkbox; Menu menu; MenuItem menuItem1; CheckboxMenuItem menuItem2; MenuItem menuItem3; MenuItem fileMenuItem; FileDialog fileDialog; MyCanvas myCanvas; Panel panel; TextArea log; TextField text; public GUIWindow() { Panel bottomPanel = new Panel(); Panel centerPanel = new Panel(); setLayout(new BorderLayout()); // Set up the menu bar. MenuBar mb = new MenuBar(); menu = new Menu("Options Menu"); menuItem1 = new MenuItem("Spawn new Window"); menuItem1.setActionCommand("1"); menuItem1.setEnabled(false); menu.add(menuItem1); menuItem2 = new CheckboxMenuItem("Enable Spawn Menu Option"); menuItem2.addItemListener(this); menu.add(menuItem2); menuItem3 = new MenuItem("Exit"); menuItem3.setActionCommand("3"); menu.add(menuItem3); menu.add(new MenuItem("-")); menu.addActionListener(this); fileMenuItem = new MenuItem(FILEDIALOGMENUITEM); fileMenuItem.addActionListener(this); menu.add(fileMenuItem); mb.add(menu); setMenuBar(mb); // Add small things at the bottom of the window. text = new TextField(40); text.addActionListener(this); bottomPanel.add(text); button = new Button("Clear Log"); button.setForeground(Color.red); button.addActionListener(this); bottomPanel.add(button); checkbox = new Checkbox("Enable Object Selection"); checkbox.addItemListener(this); bottomPanel.add(checkbox); choice = new Choice(); choice.add("Black"); choice.add("Green"); choice.add("Blue"); choice.add("Red"); choice.add("Yellow"); choice.add("Cyan"); choice.add("Magenta"); choice.addItemListener(this); bottomPanel.add(choice); add("South", bottomPanel); // Add big things to the center area of the window. centerPanel.setLayout(new GridLayout(1,2)); // Put a canvas in the left column. myCanvas = new MyCanvas(); centerPanel.add(myCanvas); // Put a label and a text area in the right column. panel = new Panel(); panel.setLayout(new BorderLayout()); panel.add("North", new Label("Log of Events", Label.CENTER)); log = new TextArea(5, 20); log.setForeground(Color.yellow); log.setBackground(Color.blue); log.setEditable(false); panel.add("Center", log); centerPanel.add(panel); add("Center", centerPanel); // Put a list on the right side of the window. list = new List(3, false); list.setEnabled(false); list.add("Circles"); list.add("Filled Circles"); list.add("Boxes"); list.add("3D Boxes"); list.add("Filled Boxes"); list.add("Filled 3D Boxes"); list.add("Kaleidescope"); list.addActionListener(this); list.addItemListener(this); add("East", list); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (inAnApplet) { dispose(); System.exit(0); } else { System.exit(0); } } }); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == this.list) return; if (source == this.choice) return; if (source == this.checkbox) return; if (source == this.button) { log.setText(""); return; } if (source == this.text) { log.append("TextField: " + text.getText()); log.append("\n"); text.selectAll(); return; } if (source == this.menu) { if (e.getActionCommand().equals("1")) { fireUpWindow(); } if (e.getActionCommand().equals("3")) { System.exit(0); } // log.append("Menu: " + ((MenuItem)(e.getSource())).getLabel()); log.append("Menu: Spawn new Window"); log.append("\n"); return; } if (source == this.fileMenuItem) { fileDialog = new FileDialog(this, "FileDialog"); fileDialog.setVisible(true); if (fileDialog.getFile() != null) { log.append("Menu: File name = " + fileDialog.getFile()); log.append("\n"); } else { log.append("Menu: file dialog box canceled"); log.append("\n"); } return; } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source == this.list) { int index = ((Integer) (e.getItem())).intValue(); myCanvas.setObject(index); log.append("List: selected list item number " + e.getItem()); log.append("\n"); } if (source == this.choice) { if (((String)e.getItem()).equals("Black")) myCanvas.setBackground(Color.black); if (((String)e.getItem()).equals("Green")) myCanvas.setBackground(Color.green); if (((String)e.getItem()).equals("Blue")) myCanvas.setBackground(Color.blue); if (((String)e.getItem()).equals("Red")) myCanvas.setBackground(Color.red); if (((String)e.getItem()).equals("Yellow")) myCanvas.setBackground(Color.yellow); if (((String)e.getItem()).equals("Cyan")) myCanvas.setBackground(Color.cyan); if (((String)e.getItem()).equals("Magenta")) myCanvas.setBackground(Color.magenta); log.append("Choice: " + e.getItem()); log.append("\n"); } if (source == this.checkbox) { if (e.getStateChange() == ItemEvent.SELECTED) { list.setEnabled(true); log.append("CheckBox: enabled List"); log.append("\n"); } else { list.setEnabled(false); log.append("CheckBox: disabled List"); log.append("\n"); } } if (source == this.menuItem2) { if (e.getStateChange() == ItemEvent.SELECTED) { menuItem1.setEnabled(true); log.append("CheckboxMenuItem: enabled \"Spawn new Window\""); log.append("\n"); } else { menuItem1.setEnabled(false); log.append("CheckboxMenuItem: disabled \"Spawn new Window\""); log.append("\n"); } } } public static void main(String[] args) { fireUpWindow(); } public static void fireUpWindow() { GUIWindow window = new GUIWindow(); window.inAnApplet = false; window.setTitle("Komponent Kaleidescope!"); window.pack(); window.setVisible(true); } } class MyCanvas extends Canvas { // Globals. int originX = 0; int originY = 0; int toggleDisplay = 0; final int MAX_DISPLAY = 7; Circles drawCircle; Circles fillCircle; Boxes drawBox; Boxes draw3DBox; Boxes fillBox; Boxes fill3DBox; Color bgColor; // Constructors. public MyCanvas() { super(); drawCircle = new Circles(Circles.DRAW); fillCircle = new Circles(Circles.FILL); drawBox = new Boxes(Boxes.DRAW, false); draw3DBox = new Boxes(Boxes.DRAW, true); fillBox = new Boxes(Boxes.FILL, false); fill3DBox = new Boxes(Boxes.FILL, true); originX = 130/2; originY = 150/2; bgColor = Color.black; MyCanvasListener myListener = new MyCanvasListener(); addMouseListener(myListener); } // Internal classes. class MyCanvasListener extends MouseAdapter implements MouseListener { public void mousePressed(MouseEvent e) { originX = e.getX(); originY = e.getY(); repaint(); } } // Methods. public void setObject(int index) { toggleDisplay = index; repaint(); } public void setBackground(Color bgColor) { this.bgColor = bgColor; repaint(); } public void paint(Graphics g) { String text; g.setColor(bgColor); g.fillRect(0, 0, 511, 511); text = ""; // prevent compiler whining switch (toggleDisplay) { case 0: drawCircle.render(g, originX, originY); text = "Circles"; break; case 1: fillCircle.render(g, originX, originY); text = "Filled Circles"; break; case 2: drawBox.render(g, originX, originY); text = "Boxes"; break; case 3: draw3DBox.render(g, originX, originY); text = "3D Boxes"; break; case 4: fillBox.render(g, originX, originY); text = "Filled Boxes"; break; case 5: fill3DBox.render(g, originX, originY); text = "Filled 3D Boxes"; break; case 6: drawCircle.render(g, originX, originY); fillCircle.render(g, originX, originY); drawBox.render(g, originX, originY); draw3DBox.render(g, originX, originY); fillBox.render(g, originX, originY); fill3DBox.render(g, originX, originY); text = "Kaleidescope!"; break; } g.setColor(Color.white); g.drawString("AWT version 1.1 event model", 32, 16); g.drawString(text, 32, 32); } //If we don't specify this, the canvas might not show up at all //(depending on the layout manager). public Dimension getMinimumSize() { return new Dimension(150, 130); } //If we don't specify this, the canvas might not show up at all //(depending on the layout manager). public Dimension getPreferredSize() { return getMinimumSize(); } } abstract class Drawings { abstract void render(Graphics g, int x, int y); static final int DRAW = 0; static final int FILL = 1; protected int random(double range) { return ((int) (Math.random() * range)); } protected int random(int range) { return (random((double) range)); } void pickColor(Graphics g) { int red = random(256); int green = random(256); int blue = random(256); Color color = new Color(red, green, blue); g.setColor(color); } } class Circles extends Drawings { private int circleType = DRAW; public Circles() { circleType = DRAW; } public Circles(int circleType) { this.circleType = circleType; } void render(Graphics g, int originX, int originY) { int iters = random(30)+2; int width = random(30)+2; for (int i = iters; i >= 0; --i) { pickColor(g); switch (this.circleType) { case DRAW: g.drawOval(originX-(i*width/2), originY-(i*width/2), i*width, i*width); break; case FILL: g.fillOval(originX-(i*width/2), originY-(i*width/2), i*width, i*width); break; } } } } class Boxes extends Drawings { private int boxType = DRAW; private boolean is3D = false; public Boxes() { boxType = DRAW; is3D = false; } public Boxes(int boxType, boolean is3D) { this.boxType = boxType; this.is3D = is3D; } void render(Graphics g, int originX, int originY) { int iters = random(30)+2; int width = random(30)+2; for (int i = iters; i >= 0; --i) { pickColor(g); switch (this.boxType) { case DRAW: if (is3D) { g.draw3DRect(originX-(i*width/2), originY-(i*width/2), i*width, i*width, true); } else { g.drawRect(originX-(i*width/2), originY-(i*width/2), i*width, i*width); } break; case FILL: if (is3D) { g.fill3DRect(originX-(i*width/2), originY-(i*width/2), i*width, i*width, true); } else { g.fillRect(originX-(i*width/2), originY-(i*width/2), i*width, i*width); } break; } } } }