📄 alganimframe.java
字号:
/* AlgAnimFrame.java */import java.awt.*;import java.applet.*;import java.io.*;import java.net.*;/** * The <code>AlgAnimFrame</code> class is a top-level window with a title * and border. The layout used is BorderLayout. There is a menubar * created at the north part of the panel. The drawing panel is at the * center and a commentary panel is located at the south. * <p> * This extended frame class holds a set references to the panel/frame objects * used in the algorithm animation. * @see Frame */public class AlgAnimFrame extends Frame { private AlgAnimApp parentApp; private URL sourceURL; private String algname; private AlgThread alg = null; private int delay = 200; //changed this.. //private Panel panel; private DrawingPanel dpBefore, dpAfter; private FlowPanel panel; //private DataPanel dataPanel; private TextFrame tf; private ComPanel cpanel; private boolean step = false, stepWait = false; private Dimension frameSize = new Dimension(850, 700); // control panel private MenuItem quitItem; private Button runItem, stopItem, stepItem, skipItem; private CheckboxMenuItem enableAnim, disableAnim; private CheckboxMenuItem[] dataChoice, delayChoice; private Menu dataMenu, delayMenu; private int dataSelected = 0; private boolean noAnim = false; Font helv10 = new Font("Helvetica", Font.PLAIN, 10); private Font helv14 = new Font("Helvetica", Font.PLAIN, 14); Font helv18 = new Font("Helvetica", Font.PLAIN, 18); Font helv24 = new Font("Helvetica", Font.PLAIN, 24); private ControlPanel cp = null; /** * Creates and shows the frame consists of a drawing panel, commentary * panel and control panel. The text frame is now displayed on a separate * window. * @param parentApp The applet which results in the creation of this frame * @param sourceURL The URL of the source code to be displayed on the text * frame * @see URL */ public AlgAnimFrame(AlgAnimApp parentApp, URL sourceURL) { this.parentApp = parentApp; this.sourceURL = sourceURL; this.algname = parentApp.getParameter("algname"); dpBefore = new DrawingPanel(); dpAfter = new DrawingPanel(); //dataPanel = new DataPanel(); setTitle(algname); move(0, 0); alg = new AlgThread(this); setLayout( new BorderLayout() ); setFont(helv14); cp = new ControlPanel(this, algname); add("North", cp); runItem = cp.getRunButton(); stopItem = cp.getStopButton(); stepItem = cp.getStepButton(); skipItem = cp.getSkipButton(); //changed... panel = new FlowPanel(this); add("Center", panel); /* Source panel */ tf = new TextFrame( sourceURL ); /* Commentary panel */ cpanel = new ComPanel( algname, 1 ); add( "South", cpanel ); setMenuBar(createMenuBar()); setMenuBar(createMenuBar()); // generate initial data set alg.generateData(); pack(); validate(); show(); //if (tf.getTextPanel().getNumLines() > 0) //tf.toFront(); cp.refreshButtons(); } // init() private MenuBar createMenuBar() { MenuBar mb = new MenuBar(); mb.setFont(helv14); dataMenu = new Menu("Select"); mb.add(dataMenu); dataChoice = new CheckboxMenuItem[alg.dataSets.length]; for (int i = 0; i < alg.dataSets.length; i++) { dataChoice[i] = new CheckboxMenuItem(alg.dataSets[i]); dataMenu.add(dataChoice[i]); } if (alg.dataSets.length > 0) dataChoice[0].setState(true); dataMenu.addSeparator(); quitItem = new MenuItem("Quit"); dataMenu.add(quitItem); /* Menu algMenu = new Menu("Algorithm", true); mb.add(algMenu); runItem = new MenuItem("Run " + algname); stopItem = new MenuItem("Stop " + algname); stepItem = new MenuItem("Next Step..."); skipItem = new MenuItem("Skip..."); algMenu.add(runItem); algMenu.add(stopItem); algMenu.add(stepItem); algMenu.add(skipItem); */ Menu animMenu = new Menu("Animation"); mb.add(animMenu); enableAnim = new CheckboxMenuItem("Enable"); enableAnim.setState(true); disableAnim = new CheckboxMenuItem("Disable"); animMenu.add(enableAnim); animMenu.add(disableAnim); animMenu.addSeparator(); delayMenu = new Menu("Delay"); animMenu.add(delayMenu); delayChoice = new CheckboxMenuItem[5]; for (int i = 0; i < 5; i++) { delayChoice[i] = new CheckboxMenuItem(""+((i+1)*200)+"msec"); delayMenu.add(delayChoice[i]); } delayChoice[0].setState(true); Menu viewMenu = new Menu("View"); mb.add(viewMenu); MenuItem srcCode = new MenuItem("Source Code"); if (tf.getTextPanel().getNumLines() < 1) srcCode.disable(); viewMenu.add(new MenuItem("Source Code")); //viewMenu.add(new MenuItem("Commentary Panel")); Menu helpMenu = new Menu("About"); mb.setHelpMenu(helpMenu); helpMenu.add(new MenuItem("Credits")); helpMenu.add(new MenuItem("Copyrights")); return mb; } // createMenuBar() /** * Returns the preferred size of the frame. By default, it is set * to 850x700. It can be modified based on the specific application. * @return the dimension of the frame */ public Dimension preferredSize() { return frameSize; } /** * Sets the size of the frame. * @param size The desired sized of the frame. */ public void setDimension(Dimension size) { this.frameSize = size; } /** * Event handler of the frame. The main purpose of this method is to * perform the cleanup statements upon receival of the WINDOW_DESTROY * event message. */ public boolean handleEvent(Event event) { if (cp != null) cp.refreshButtons(); if (event.id == Event.WINDOW_DESTROY) { if (alg != null) { alg.dpAfter = null; if (alg.isAlive()) alg.stop(); } parentApp.start_button.enable(); tf.dispose(); dispose(); } return super.handleEvent(event); } /** * Action handler for the buttons and choice buttons in the control * panel. * @param e Event invoked * @param arg Object that invokes the event */ public boolean action(Event e, Object arg) { Object target = e.target; if (target == quitItem) { getApplet().start_button.enable(); if (getAlg() != null && getAlg().isAlive()) getAlg().stop(); getTextFrame().dispose(); dispose(); } else if (target instanceof CheckboxMenuItem) { Menu parent = (Menu)((MenuItem)target).getParent(); if (parent == dataMenu) { for (int i = 0; i < dataChoice.length; i++) { if (target == dataChoice[i]) { dataSelected = i; alg.generateData(); dataChoice[i].setState(true); } else dataChoice[i].setState(false); } } else if (parent == delayMenu) { for (int i = 0; i < delayChoice.length; i++) { if (target == delayChoice[i]) { setDelay((i+1)*200); getAlg().setDelay(getDelay()); setText(0, "Animation delay now set to " + getDelay() + " msec..."); delayChoice[i].setState(true); } else delayChoice[i].setState(false); } } else { // parent is Animation.. -> enable/disable anim if (target == enableAnim) { disableAnim.setState(!enableAnim.getState()); noAnim = false; dpAfter.setNoAnim(noAnim); } else if (target == disableAnim) { enableAnim.setState(!disableAnim.getState()); noAnim = true; dpAfter.setNoAnim(noAnim); } } } else { if (target instanceof MenuItem) { String text = ((MenuItem)target).getLabel(); if (text.trim().equals("Source Code")) { tf.show(); tf.toFront(); } else if (text.trim().equals("Credits")) { setText(0, "Author: Woi L Ang Supervised by: John Morris"); } else if (text.trim().equals("Copyrights")) { setText(0, "Copyright (c) 1998 The Department of Electrical and Electronic Engineering. University of Western Australia"); } } } return false; } // action() /** * Sets the text string to be displayed on a specific text field on the * commentary panel return from <code>getComPanel</code>.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -