ActionListener in JMenuItem

Hi!
I'm having problems with adding ActionListener on JMenuItem. I do it like this:
    JMenuItem saveMenuItem = new JMenuItem();
    saveMenuItem.addActionListener(new ActionListener()
      public void actionPerformed(ActionEvent e)
        System.out.println("actionPerformed!");
        saveActionPerformed(e);       
    });No even when I select that menu item from my GUI, the action is not launched! Compiler does not give any errors, so it should be ok. Can anyone tell me what's the problem?? I'm using JDK 1.3.1-b24, btw.
/jasurakk

Hi jasurakka,
just reading the source code, nothing seems to be
wrong. May be there's a problem using an adapter class
as listener. I suggest you try to write an own class
implementing the ActionListener interface and then add
this class as ActionListener to your menu items.
Appears to me, that this is anyway the better
solution, cause you create only one ActionListener
listening for all the menu items you're adding instead
of creating a new listener instance for each menu
item. In the latter case, you have to add and check a
unique action command for each item.Yeah, that's pretty much what I had before... But when I couldn't make it work, I tried to add own actionlistener for all menu items. Unfortunately it didn't help at all:=( Might you have any other ideas of what to do?

Similar Messages

  • ActionListener as nested class, anonymous class etc.

    I'm programing my own text editor and im trying to decide in what way to implement an ActionListener for JMenuItems.
    I've got 3 possible ideas of how to implement it.
    First way is to implement the ActionListener in the same class as the JMenu and use a switch statement or a fairly long if-else statement.
    Second way is to create nested classes for each ActoinEvent.
    public class OuterClass {
         //Some random code here...
         private class ActionClass implements ActionListener{
              public void actionPerformed(ActionEvent e) {
                   //Random code.
    }And final way is creating anonymous classes adding ActionListeners for each JMenuItem.
    menuItem.addActionListener(new AbstractAction(){
    public void actionPerformed(ActionEvent e) {
    });But i can't decide on wich of these are the moste correct and accepted way.
    Could someone point me to the right direction?
    Edited by: Idono on Jun 3, 2010 7:36 PM

    the only time you would do the first one would be if you wanted several ActionListeners to do the EXACT SAME THING.
    Then you just write the "actionClass" one time, and have each Component use it.
    private class ActionClass implements ActionListener{
              public void actionPerformed(ActionEvent e) {
                   //Random code.
    menuItem.addActionListener(new ActionClass());
    menuItem1.addActionListener(new ActionClass());
    menuItem2.addActionListener(new ActionClass());
    menuItem3.addActionListener(new ActionClass());But (as the other person mentioned) usually you use anonymous classes because each component has different actions.
    menuItem.addActionListener(new AbstractAction(){
    public void actionPerformed(ActionEvent e) { ... }
    menuItem1.addActionListener(new AbstractAction(){
    public void actionPerformed(ActionEvent e) { ... }
    menuItem2.addActionListener(new AbstractAction(){
    public void actionPerformed(ActionEvent e) { ... }
    });

  • What's wrong with this?

    Hi
    This question is for people who know java not for those who think they know. OK here we go. Here is my file can you take a look and tell me why it is not showing the yahoo.com in browser window??
    Thanks a lot
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.net.URL;
    import java.net.*;
    import java.net.MalformedURLException;
    import java.applet.*;
    import java.util.Enumeration;
    public class MyMenue extends JApplet implements ActionListener, AppletContext
    JMenuItem subitem;
    URL url;
    public void init()
    //super(title);
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
    //Menu Items
    JMenuBar jmbar = new JMenuBar();
    JMenu menu = new JMenu("menu");
    //submenus elements
    JMenu submenu = new JMenu("submenu");
    subitem = new JMenuItem("MenuItemWithEvent");
    subitem.addActionListener(this);
    submenu.add(subitem);
    submenu.add(new JMenuItem("MenuItem_1.2"));
    submenu.add(new JMenuItem("MenuItem_1.3"));
    //Creating Sumbemnus and their items
    JMenuItem mitem2 = submenu;
    menu.add(mitem2);
    //Adding one menue to the Menu Bar class
    jmbar.add(menu);
    menu.add(new JMenuItem("MenuItem_1"));
    menu.add(new JMenuItem("MenuItem_2"));
    menu.add(new JMenuItem("MenuItem_3"));
    menu.add(submenu);
    c.add(jmbar, BorderLayout.NORTH);
    //setSize(300,200);
    //setVisible(true);
    public void actionPerformed(ActionEvent e)
    Object source = e.getSource();
    AppletContext appletEnv = getAppletContext();
    if (source.equals(subitem))
    try
    url = new URL("http://www.yahoo.com");
    showDocument(url);
    System.out.println("Testing");
    catch (MalformedURLException er)
    System.out.println("Bad URL : yahoo.com");
    public Applet getApplet(String name)
    //Finds and returns the applet in the document represented by this applet
    //context with the given name.
    return null;
    public Enumeration getApplets()
    // Finds all the applets in the document represented by this applet context.
    return null;
    public AudioClip getAudioClip(URL url)
    //Creates an audio clip.
    return null;
    public Image getImage(URL url)
    //Returns an Image object that can then be painted on the screen.
    return null;
    public void showDocument(URL u)
    //Replaces the Web page currently being viewed with the given URL.
    public void showDocument(URL url, String target)
    //Requests that the browser or applet viewer show the Web page indicated
    //by the url argument.
    public void showStatus(String status)
    //Requests that the argument string be displayed in the "status window".
    }

    Hi,
    You're code is not working because you implement AppletContext yourself but override all methods. Here's the modified version:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.net.URL;
    import java.net.*;
    import java.net.MalformedURLException;
    import java.applet.*;
    import java.util.Enumeration;
    public class MyMenue extends JApplet implements ActionListener
         JMenuItem subitem;
         URL url;
         AppletContext appletEnv;
         public void init()
              appletEnv = getAppletContext();
              //super(title);
              Container c = getContentPane();
              c.setLayout(new BorderLayout());
              //Menu Items
              JMenuBar jmbar = new JMenuBar();
              JMenu menu = new JMenu("menu");
              //submenus elements
              JMenu submenu = new JMenu("submenu");
              subitem = new JMenuItem("MenuItemWithEvent");
              subitem.addActionListener(this);
              submenu.add(subitem);
              submenu.add(new JMenuItem("MenuItem_1.2"));
              submenu.add(new JMenuItem("MenuItem_1.3"));
              //Creating Sumbemnus and their items
              JMenuItem mitem2 = submenu;
              menu.add(mitem2);
              //Adding one menue to the Menu Bar class
              jmbar.add(menu);
              menu.add(new JMenuItem("MenuItem_1"));
              menu.add(new JMenuItem("MenuItem_2"));
              menu.add(new JMenuItem("MenuItem_3"));
              menu.add(submenu);
              c.add(jmbar, BorderLayout.NORTH);
              //setSize(300,200);
              //setVisible(true);
         public void actionPerformed(ActionEvent e)
              Object source = e.getSource();
              if (source.equals(subitem))
                   try
                        url = new URL("http://www.yahoo.com");
                        appletEnv.showDocument(url);
                        System.out.println("Testing");
                   catch (MalformedURLException er)
                        System.out.println("Bad URL : yahoo.com");
    }... and don't forget to use the java plug-in (because you're using swing)
    I've tested the code in Internet Explorer 5 on Windows 2000.
    Hope this helps,
    Kurt.

  • Help, experiencing minor bugs in program

    this is supposed to use rectangles and you should be able to load and save and they have colors and do a few more things with them, the loading is where it doesn't work.
    *-------------------------------------------------------------- 80 columns ---|
    * This is the main class for the application. It is built along the same
    * lines as the Editor class of project 1. It has a constructor, two instance
    * methods, and a static main()  that kicks the whole thing off.
    * The two instance methods are a menu creation method, and a menuItems
    * initialisation method.  The constructor instantiates the window
    * and sets up its internals by creating and installing the drawing canvas,
    * toolbar, and menus. All of the code works correctly as is and should
    * require no changes.
    * @version      1.1 15/04/01
    * @author       Julie Zelenski
    * @author       Restructured by Ian A. Mason
    * @see       javax.swing.JFrame
    * @see       javax.swing.JMenuBar
    * @see       javax.swing.JMenuItem
    * @see       javax.swing.JMenu
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    public class JavaDraw extends JFrame {
        final Toolbar toolbar = new Toolbar();
        final DrawingCanvas canvas = new DrawingCanvas(toolbar, 350, 350);
        final int menuMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        final JMenuBar mb = new JMenuBar();
        final String[]
             fileMenuItems = {"Clear all", "Load file", "Save to file", "Quit"};
        final int[] fileKeyCodes = {KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_S, KeyEvent.VK_Q};
        final ActionListener[] fileActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.clearAll();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.loadFile();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.saveToFile();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  System.exit(0);}}
        final String[] editMenuItems = {"Cut", "Copy", "Paste", "Delete"};
        final int[] editKeyCodes = {KeyEvent.VK_X, KeyEvent.VK_C, KeyEvent.VK_V, KeyEvent.VK_BACK_SPACE};
        final int[] editMenuMasks = {menuMask, menuMask, menuMask, 0};
        final ActionListener[] editActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.cut();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.copy();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.paste();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.delete();}}
        final String[] layeringMenuItems = {"Bring to front", "Send to back"};
        final int[]    layeringKeyCodes = {KeyEvent.VK_F, KeyEvent.VK_B};
        final ActionListener[] layeringActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.bringToFront();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.sendToBack();}}
        private JavaDraw(){
         super("JavaDraw!");
         toolbar.setCanvas(canvas);
         getContentPane().add(toolbar, BorderLayout.SOUTH);
         getContentPane().add(canvas, BorderLayout.CENTER);
         createMenus();
         setJMenuBar(mb);
         setLocation(100, 20);
         pack();
         setVisible(true);
        static public void main(String[] args){
         JavaDraw javaDraw = new JavaDraw();
        private void initMenus(JMenu m,
                      String  miLabel,
                      int keyCode,
                      int menuMask,
                      ActionListener al){
         JMenuItem mi = new JMenuItem(miLabel);
         m.add(mi);
         mi.addActionListener(al);
         mi.setAccelerator(KeyStroke.getKeyStroke(keyCode, menuMask));
        private void createMenus(){
         JMenu m;
         m = new JMenu("File");
         for(int i = 0; i < fileMenuItems.length; i++)
             initMenus(m,
                    fileMenuItems,
              fileKeyCodes[i],
              menuMask,
              fileActionListeners[i]);
         mb.add(m);
         m = new JMenu("Edit");
         for(int i = 0; i < editMenuItems.length; i++)
         initMenus(m,
              editMenuItems[i],
              editKeyCodes[i],
              editMenuMasks[i],
              editActionListeners[i]);
         mb.add(m);
         m = new JMenu("Layering");
         for(int i = 0; i < layeringMenuItems.length; i++)
         initMenus(m,
              layeringMenuItems[i],
              layeringKeyCodes[i],
              menuMask,
              layeringActionListeners[i]);
         mb.add(m);
    *-------------------------------------------------------------- 80 columns ---|
    * The DrawingCanvas class a small extension of JComponent
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    * @see javax.swing.JComponent
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;
    public class DrawingCanvas extends JComponent{
    static final int DRAG_NONE = 0;
    static final int DRAG_CREATE = 1;
    static final int DRAG_RESIZE = 2;
    static final int DRAG_MOVE = 3;
    // list of all shapes on canvas
    protected Vector allShapes;          
    // currently selected shape (can be null at times)
    protected Rect selectedShape;
    // reference to toolbar to message for tool&color settings
    protected Toolbar toolbar;
    protected Rect clipboard=null;          
    /* These are the unimplemented menu commands. The menus are already
    * set up to send the correct messages to the canvas, but the
    * method bodies themselves are currently completely empty. It will
    * be your job to fill them in!
    public void cut() {
         copy();
         delete();
    public void copy() {
         int x=(int)selectedShape.getBounds().getX();
         int y=(int)selectedShape.getBounds().getY();
         Point p=new Point(x,y);
         clipboard=new Rect(p,this);
         clipboard.setBounds(selectedShape.getBounds());
    public void paste() {
         if(clipboard==null)
              return;
         allShapes.add(clipboard);
         setSelectedShape(clipboard);
         copy();
         this.repaint();
    public void delete() {
         if(selectedShape==null)
              return;
         else{
         int num=allShapes.indexOf(selectedShape);
         allShapes.remove(num);
         selectedShape=null;
         this.repaint();
    public void clearAll() {
         allShapes.removeAllElements();
         this.repaint();
    public void loadFile() {
         Load load=new Load(this);
         load.setSize(250,200);
         load.validate();
         load.setVisible(true);
    public void done(Vector vect){
         allShapes.removeAllElements();
         for(int i=0;i<vect.size();i++){
              allShapes.add(vect.elementAt(i));
         this.repaint();
    public void saveToFile() {
         Save save=new Save(allShapes);
         save.setSize(250,200);
         save.validate();
         save.setVisible(true);
    public void bringToFront() {
         if(selectedShape==null)
              return;
         int size=allShapes.size();
         int index=allShapes.indexOf(selectedShape);
         for(int i=index+1;i<=size-1;i++){
              allShapes.set(i-1,allShapes.elementAt(i));
         allShapes.set(size-1,selectedShape);
         this.repaint();
    public void sendToBack() {
         if(selectedShape==null)
              return;
         int index=allShapes.indexOf(selectedShape);
         for(int i=index-1;i>=0;i--){
              allShapes.remove(allShapes.elementAt(i+1));
              allShapes.add(i+1,allShapes.elementAt(i));
         allShapes.remove(allShapes.elementAt(0));
         allShapes.add(0,selectedShape);
         this.repaint();
    * Constructor for creating a new empty DrawingCanvas. We set up
    * our size and background colors, instantiate an empty vector of shapes,
    * and install a listener for mouse events using our inner class
    * CanvasMouseHandler
    public DrawingCanvas(Toolbar tb, int width, int height){
         setPreferredSize(new Dimension(width, height));
         setBackground(Color.white);
         toolbar = tb;
         allShapes = new Vector();
         selectedShape = null;
         CanvasMouseHandler handler = new CanvasMouseHandler();
         addMouseListener(handler);
         addMouseMotionListener(handler);
    * All components are responsible for drawing themselves in
    * response to repaint() requests. The standard method a component
    * overrides is paint(Graphics g), but for Swing components, the default
    * paint() handler calls paintBorder(), paintComponent() and paintChildren()
    * For a Swing component, you override paintComponent and do your
    * drawing in that method. For the drawing canvas, we want to
    * clear the background, then iterate through our shapes asking each
    * to draw. The Graphics object is clipped to the region to update
    * and we use to that avoid needlessly redrawing shapes outside the
    * update region.
    public void paintComponent(Graphics g){
         Rectangle regionToRedraw = g.getClipBounds();
         g.setColor(getBackground());
         g.fillRect(regionToRedraw.x, regionToRedraw.y,
              regionToRedraw.width, regionToRedraw.height);
         Iterator iter = allShapes.iterator();
         while (iter.hasNext())
         ((Rect)iter.next()).draw(g, regionToRedraw);
    * Changes the currently selected shape. There is at most
    * one shape selected at a time on the canvas. It is possible
    * for the selected shape to be null. Messages the shape to
    * change its selected state which will in turn refresh the
    * shape with the knobs active.
    protected void setSelectedShape(Rect shapeToSelect) {
         // if change in selection
         if (selectedShape != shapeToSelect) {
         // deselect previous selection
         if (selectedShape != null)
              selectedShape.setSelected(false);
         // set selection to new shape
         selectedShape = shapeToSelect;
         if (selectedShape != null) {
              shapeToSelect.setSelected(true);
    * A hit-test routine which finds the topmost shape underneath a
    * given point.We search Vector of shapes in back-to-front order
    * since shapes created later are added to end and drawn last, thus
    * appearing to be "on top" of the earlier ones. When a click comes
    * in, we want to select the top-most shape.
    protected Rect shapeContainingPoint(Point pt){
         for (int i = allShapes.size()-1; i >= 0; i--) {
         Rect r = (Rect)allShapes.elementAt(i);
         if (r.inside(pt)) return r;
         return null;
    * The inner class CanvasMouseHandler is the object that handles the
    * mouse actions (press, drag, release) over the canvas. Since there is
    * a bit of state to drag during the various operations (which shape,
    * where we started from, etc.) it is convenient to encapsulate all that
    * state with this little convenience object and register it as the
    * handler for mouse events on the canvas.
    protected class CanvasMouseHandler
         extends MouseAdapter implements MouseMotionListener {
         Point dragAnchor;          
         // variables using to track state during drag operations
         int dragStatus;
         /** When the mouse is pressed we need to figure out what
         * action to take. If the tool mode is arrow, the click might
         * be a select, move or reisze. If the tool mode is one of the
         * shapes, the click initiates creation of a new shape.
         public void mousePressed(MouseEvent event){
         Rect clicked = null;
         Point curPt = event.getPoint();
         // first, determine if click was on resize knob of selected shape
         if (toolbar.getCurrentTool() == Toolbar.SELECT) {
              if (selectedShape != null &&
              (dragAnchor = selectedShape.getAnchorForResize(curPt))
              != null) {
              // drag will resize this shape
              dragStatus = DRAG_RESIZE;     
              } else if ((clicked = shapeContainingPoint(curPt)) != null) {
              // if not, check if any shape was clicked
              setSelectedShape(clicked);
              // drag will move this shape      
              dragStatus = DRAG_MOVE;
              dragAnchor = curPt;
              } else {     
              // else this was a click in empty area,
              // deselect selected shape,
              setSelectedShape(null);
              // drag does nothing in this case
              dragStatus = DRAG_NONE;
         } else {
              Rect newShape = new Rect(curPt, DrawingCanvas.this);
              // create rect here
              allShapes.add(newShape);
              setSelectedShape(newShape);
              dragStatus = DRAG_CREATE;          
              // drag will create (resize) this shape
              dragAnchor = curPt;
         /** As the mouse is dragged, our listener will receive periodic
         * updates as mouseDragged events. When we get an update position,
         * we update the move/resize event that is in progress.
         public void mouseDragged(MouseEvent event){
         Point curPt = event.getPoint();
         switch (dragStatus) {
         case DRAG_MOVE:
              selectedShape.translate(curPt.x - dragAnchor.x,
                             curPt.y - dragAnchor.y);
              // update for next dragged event
              dragAnchor = curPt;
              break;
         case DRAG_CREATE: case DRAG_RESIZE:
              selectedShape.resize(dragAnchor, curPt);
              break;
         public void mouseMoved(MouseEvent e) {}
    /** A little helper routine that will be useful for the load & save
    * operations. It brings up the standard JFileChooser dialog and
    * allows the user to specify a file to open or save. The return
    * value is the full path to the chosen file or null if no file was
    * selected.
    protected String filenameChosenByUser(boolean forOpen){
         JFileChooser fc = new JFileChooser(System.getProperty("user.dir") +
                             java.io.File.separator + "Documents");
         int result = (forOpen? (fc.showOpenDialog(this)) :
              fc.showSaveDialog(this));
         java.io.File chosenFile = fc.getSelectedFile();
         if (result == JFileChooser.APPROVE_OPTION && chosenFile != null)
         return chosenFile.getPath();
         return null;
         // return null if no file chosen or dialog cancelled
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Vector;
    import java.io.*;
    class Load extends JFrame implements ActionListener, Serializable{
         Container contentPane;
         JTextField jtf;
         JButton jb;
         Object obj=null;
         Load load;
         Thread thread;
         DrawingCanvas draw;
         public Load(DrawingCanvas dc){
              draw=dc;
              contentPane=getContentPane();
              contentPane.setLayout(new FlowLayout());
              jtf=new JTextField(20);
              jb=new JButton("Load");
              jb.addActionListener(this);
              contentPane.add(jtf);
              contentPane.add(jb);
         public void actionPerformed(ActionEvent e){
              String text=jtf.getText();
              SimpleObjectReader reader=SimpleObjectReader.openFileForReading(text+".shp");
              if(reader==null){
                   System.out.println("Couldn't open file!");
                   return;
              obj=reader.readObject();
              reader.close();
              draw.done((Vector)obj);
              this.setVisible(false);
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.util.Vector;
    import java.io.*;
    class Save extends JFrame implements ActionListener, Serializable{
         Container contentPane;
         JTextField jtf;
         Vector shapes;
         JButton jb;
         public Save(Vector shapeVector){
              shapes=shapeVector;
              contentPane=getContentPane();
              contentPane.setLayout(new FlowLayout());
              jtf=new JTextField(20);
              jb=new JButton("Save");
              jb.addActionListener(this);
              contentPane.add(jtf);
              contentPane.add(jb);
         public void actionPerformed(ActionEvent e){
              String text=jtf.getText();
              SimpleObjectWriter writer=SimpleObjectWriter.openFileForWriting(text+".shp");
              if(writer==null){
                   System.out.println("Couldn't open file!");
                   return;
              writer.writeObject(shapes);
              writer.close();
              this.setVisible(false);
    *-------------------------------------------------------------- 80 columns ---|
    * The RectShape class defines a simple rectangular shape object.
    * It tracks its bounding box, selected state, and the canvas it is being
    * drawn in. It has some basic methods to select, move, and resize the
    * rectangle. It has methods that draw the shape in the selected or unselected
    * states and updates the canvas whenever the state or bounds of the rectangle
    * change. The code that is there works properly, but you will need to extend
    * and change the code to support additional features.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    import java.awt.*;
    import java.io.*;
    public class Rect implements Serializable{     
    protected Rectangle bounds;
    protected boolean isSelected;
    public Color color;
    public DrawingCanvas canvas;
    protected static final int KNOB_SIZE = 6;
    protected static final int NONE = -1;
    protected static final int NW = 0;
    protected static final int SW = 1;
    protected static final int SE = 2;
    protected static final int NE = 3;
    /** The constructor that creates a new zero width and height rectangle
    * at the given position in the canvas.
    public Rect(Point start, DrawingCanvas dcanvas){
         canvas = dcanvas;
         bounds = new Rectangle(start);
         color=canvas.toolbar.getCurrentColor();
    /** The "primitive" for all resizing/moving/creating operations that
    * affect the rect bounding box. The current implementation just resets
    * the bounds variable and triggers a re-draw of the union of the old &
    * new rectangles. This will redraw the shape in new size and place and
    * also "erase" if bounds are now smaller than before. It is a good
    * design to have all changes to a critical variable bottleneck through
    * one method so that you can be sure that all the updating that goes
    * with it only needs to be implemented in this one place. If any of your
    * subclasses have additional work to do when the bounds change, this is
    * the method to override. Make sure that any methods that change the
    * bounds call this method instead of directly manipulating the variable.
    protected void setBounds(Rectangle newBounds){
         Rectangle oldBounds = bounds;
         bounds = newBounds;
         updateCanvas(oldBounds.union(bounds));
    /** The resize operation is called when first creating a rect, as well as
    * when later resizing by dragging one of its knobs. The two parameters
    * are the points that define the new bounding box. The anchor point
    * is the location of the mouse-down event during a creation operation
    * or the opposite corner of the knob being dragged during a resize
    * operation. The end is the current location of the mouse. If you
    * create the smallest rectangle which encloses these two points, you
    * will have the new bounding box. Use the setBounds() primitive which
    * is the bottleneck we are using for all geometry changes, it handles
    * updating and redrawing.
    public void resize(Point anchor, Point end){
         Rectangle newRect = new Rectangle(anchor);
         // creates smallest rectange which
         // includes both anchor & end
         newRect.add(end);
         // reset bounds & redraw affected areas
         setBounds(newRect);      
    public Rectangle getBounds(){
         return bounds;
    /** The translate operation is called when moving a shape by dragging in
    * the canvas. The two parameters are the delta-x and delta-y to move
    * by. Note that either or both can be negative. Create a new rectangle
    * from our bounds and translate and then go through the setBounds()
    * primitive to change it.
    public void translate(int dx, int dy){
         Rectangle newRect = new Rectangle(bounds);
         newRect.translate(dx, dy);
         setBounds(newRect);
    /** Used to change the selected state of the shape which will require
    * updating the affected area of the canvas to add/remove knobs.
    public void setSelected(boolean newState){
         isSelected = newState;
         // need to erase/add knobs
         // including extent of extended bounds
         updateCanvas(bounds, true);
    /** The updateCanvas() methods are used when the state has changed
    * in such a way that it needs to be refreshed in the canvas to properly
    * reflect the new settings. The shape should take responsibility for
    * messaging the canvas to properly update itself. The appropriate AWT/JFC
    * way to re-draw a component is to send it the repaint() method with the
    * rectangle that needs refreshing. This will cause an update() event to
    * be sent to the component which in turn will call paint(), where the
    * real drawing implementation goes. See the paint() method in
    * DrawingCanvas to see how it is implemented.
    protected void updateCanvas(Rectangle areaOfChange, boolean enlargeForKnobs){
         Rectangle toRedraw = new Rectangle(areaOfChange);
         if (enlargeForKnobs)
         toRedraw.grow(KNOB_SIZE/2, KNOB_SIZE/2);
         canvas.repaint(toRedraw);
    protected void updateCanvas(Rectangle areaOfChange){
         updateCanvas(areaOfChange, isSelected);
    /** When the DrawingCanvas needs a shape to draw itself, it sends a draw
    * message, passing the graphics context and the current region being
    * redrawn. If the shape intersects with that region, it must draw itself
    * doing whatever it takes to properly represent itself in the canvas
    * (colors, location, size, knobs, etc.) by messaging the Graphics object.
    public void draw(Graphics g, Rectangle regionToDraw){
         if (!bounds.intersects(regionToDraw))
         return;
         g.setColor(color);
         g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
         if (isSelected) { // if selected, draw the resizing knobs
         // along the 4 corners
         Rectangle[] knobs = getKnobRects();
         for (int i = 0; i < knobs.length; i++)
              g.fillRect(knobs[i].x, knobs[i].y,
                   knobs[i].width, knobs[i].height);
    /** When the DrawingCanvas needs to determine which shape is under
    * the mouse, it asks the shape to determine if a point is "inside".
    * This method should returns true if the given point is inside the
    * region for this shape. For a rectangle, any point within the
    * bounding box is inside the shape.
    public boolean inside(Point pt){
         return bounds.contains(pt);
    /** When needed, we create the array of knob rectangles on demand. This
    * does mean we create and discard the array and rectangles repeatedly.
    * These are small objects, so perhaps it is not a big deal, but
    * a valid alternative would be to store the array of knobs as an
    * instance variable of the Shape and and update the knobs as the bounds
    * change. This means a little more memory overhead for each Shape
    * (since it is always storing the knobs, even when not being used) and
    * having that redundant data opens up the possibility of bugs from
    * getting out of synch (bounds move but knobs didn't, etc.) but you may
    * find that a more appealing way to go. Either way is fine with us.
    * Note this method provides a nice unified place for one override from
    * a shape subclass to substitute fewer or different knobs.
    protected Rectangle[] getKnobRects(){
         Rectangle[] knobs = new Rectangle[4];
         knobs[NW] = new Rectangle(bounds.x - KNOB_SIZE/2,
                        bounds.y - KNOB_SIZE/2, KNOB_SIZE, KNOB_SIZE);
         knobs[SW] = new Rectangle(bounds.x - KNOB_SIZE/2,
                        bounds.y + bounds.height - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         knobs[SE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
                        bounds.y + bounds.height - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         knobs[NE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
                        bounds.y - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         return knobs;
    /** Helper method to determine if a point is within one of the resize
    * corner knobs. If not selected, we have no resize knobs, so it can't
    * have been a click on one. Otherwise, we calculate the knob rects and
    * then check whether the point falls in one of them. The return value
    * is one of NW, NE, SW, SE constants depending on which knob is found,
    * or NONE if the click doesn't fall within any knob.
    protected int getKnobContainingPoint(Point pt){
         // if we aren't selected, the knobs
         // aren't showing and thus there are no knobs to check
         if (!isSelected) return NONE;
         Rectangle[] knobs = getKnobRects();
         for (int i = 0; i < knobs.length; i++)
         if (knobs[i].contains(pt))
              return i;
         return NONE;
    /** Method used by DrawingCanvas to determine if a mouse click is starting
    * a resize event. In order for it to be a resize, the click must have
    * been within one of the knob rects (checked by the helper method
    * getKnobContainingPoint) and if so, we return the "anchor" ie the knob
    * opposite this corner that will remain fixed as the user drags the
    * resizing knob of the other corner around. During the drag actions of a
    * resize, that fixed anchor point and the current mouse point will be
    * passed to the resize method, which will reset the bounds in response
    * to the movement. If the mouseLocation wasn't a click in a knob and
    * thus not the beginning of a resize event, null is returned.
    public Point getAnchorForResize(Point mouseLocation){
         int whichKnob = getKnobContainingPoint(mouseLocation);
         // no resize knob is at this location
         if (whichKnob == NONE)
         return null;
         switch (whichKnob) {
         case NW: return new Point(bounds.x + bounds.width,
                        bounds.y + bounds.height);
         case NE: return new Point(bounds.x, bounds.y + bounds.height);
         case SW: return new Point(bounds.x + bounds.width, bounds.y);
         case SE: return new Point(bounds.x, bounds.y);
         return null;
    import java.io.*;
    * SimpleObjectReader is a small class to wrap around the usual ObjectStream
    * to shield you from the exception handling which we haven't yet gotten
    * to in class.
    * <P>It has just three methods of note: one to open a new file for reading,
    * one to read an object from an open file, and one to close the file when done.
    * <P>Any object that you attempt to read must properly implement the Serializable
    * interface. Here is a simple example that shows using the SimpleFileReader to
    * to rehydrate objects from a file and print them:
    * <PRE>
    * SimpleObjectReader reader = SimpleObjectReader.openFileForReading("shapes");
    * if (reader == null) {
    * System.out.println("Couldn't open file!");
    * return;
    * Object obj;
    * while ((obj = reader.readObject()) != null)
    * System.out.println(obj);
    * reader.close();
    * </PRE>
    * <P>You are free to edit or extend this class, but we don't expect that
    * you should need to make any changes.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    public class SimpleObjectReader {
    private ObjectInputStream ois;
    * Opens a new file for reading. The filename can either be a relative
    * path, which will be relative to the working directory of the program
    * when started, or an absolute path. If the file exists and can be
    * opened, a new SimpleObjectReader is returned. If the file cannot be
    * opened (for any reason: wrong name, wrong path, lack of permissions, etc.)
    * null is returned.
    public static SimpleObjectReader openFileForReading(String filename){
         try {
         return new SimpleObjectReader(new ObjectInputStream(new FileInputStream(filename)));
         } catch(IOException e) {     
         return null;
    * Reads a single object from the file and returns it. If there are
    * no more objects in the file (i.e, we have reached the end of file),
    * null is returned null is returned. null is also
    * returned on any I/O error.
    public Object readObject (){
         try {
         return ois.readObject();
         } catch (IOException e) {
         e.printStackTrace();
         return null;
         } catch (ClassNotFoundException e) {
         e.printStackTrace();
         return null;
    * Closes the file when done reading. You should close a reader when
    * you are finished to release the OS resources for use by others.
    public void close (){
         try {
         ois.close();
         catch (IOException e) {}
    * Constructor is private so that only means to create a new reader
    * is through the static method which does error checking.
    private SimpleObjectReader(ObjectInputStream ois){
         this.ois = ois;
    import java.io.*;
    * SimpleObjectWriter is a small class to wrap around the usual
    * ObjectOutputStream to shield you from the exception handling
    * which we haven't yet gotten to in class.
    * <P>It has just three methods of note: one to open a new file for writing,
    * one to write an object to the file, and one to close the
    * the file when done.
    * <P>Here is a simple example that shows using the SimpleObjectWriter
    * to create a new file and write some objects into it:
    * <PRE>
    * SimpleObjectWriter writer =
    * SimpleObjectWriter.openFileForWriting("objects");
    * if (writer == null) {
    * System.out.println("Couldn't open file!");
    * return;
    * writer.writeObject("Here is a string");
    * writer.writeObject("And another one.");
    * writer.writeObject(new Date());
    * writer.close();
    * </PRE>
    * <P>You are free to edit or extend this class, but we don't expect that
    * you should need to make any changes.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    public class SimpleObjectWriter {
    private ObjectOutputStream oos;
    * Opens a new file for writing. The filename can either be a relative
    * path, which will be relative to the working directory of the program
    * when started, or an absolute path. If the file can be created, a
    * new SimpleObjectWriter is returned. If the file already exists, this
    * will overwrite its content

    I'm not reading that either, but to help you for next time:
    - use more than 1 sentence to describe your problem
    - only post the RELEVANT code, or a small test program with the same problem if possible.
    At least you formatted it, I'll give you that.
    Cheers,
    Radish21
    PS. I think in this case, posting another (better worded) thread might be a good idea, because no one is going to read this one. In general though, don't :)

  • Can't make applet quit on the inside

    In my Program, I did a System.exit(0) put it won't quit the applet. It continue running. Can you please look at my code and see what changes I should make?
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import java.awt.event.*;
    * Class NIMgame - write a description of the class here
    * @author
    * @version 05/29
    public class NIMgame extends JApplet
    // instance variables:
    private JMenuBar menuBar;
    private JMenu gameMenu,objectMenu;
    private JPanel panel;
    private JPanel mainPanel;
    private int [] nim;
    private int x,y;
    private NIM game;
    private String response;
    private String response1;
    private String response2;
    private String response3;
    private Image img;
    private boolean imgBool;
    *This is always called before the first
    * time that the start method is called.
    public void init()
    // initialize the instance variables
    img=getImage(getDocumentBase(),"atom.gif");
    imgBool=false;
    setLayout(new BorderLayout());
    menuBar = new JMenuBar();
    MenuHandler listener = new MenuHandler();
    gameMenu = new JMenu("Game");
    gameMenu.addSeparator();
    addMenuItem(gameMenu,"new Standard",listener);
    addMenuItem(gameMenu,"new Standard4",listener);
    addMenuItem(gameMenu,"new Custom3",listener);
    addMenuItem(gameMenu,"Quit",listener);
    menuBar.add(gameMenu);
    objectMenu = new JMenu("Objects");
    addMenuItem(objectMenu,"Images",listener);
    addMenuItem(objectMenu,"Rectangles",listener);
    gameMenu.addActionListener(listener);
    objectMenu.addActionListener(listener);
    objectMenu.addSeparator();
    menuBar.add(objectMenu);
    panel = new JPanel();
    nim = new int [3];
    nim[0]=1;
    nim[1]=2;
    nim[2]=3;
    panel.add(menuBar);
    getContentPane().add(panel,BorderLayout.NORTH);
    mainPanel = new Board();
    getContentPane().add(mainPanel,BorderLayout.CENTER);
    setJMenuBar(menuBar);
    x=y=-999;
    game=new NIM(nim);
    class Board extends JPanel {
    public Board(){
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent me){
    x=me.getX();
    y=me.getY();
    game.check(x,y);
    mainPanel.repaint();
    public void paintComponent(Graphics g)
    super.paintComponent(g);
    //g.drawImage(img,200,200,40,40,this);
    game.drawMe(g);
    repaint();
    public void addMenuItem(JMenu menu, String comm, ActionListener listener) {
    JMenuItem menuItem = new JMenuItem(comm);
    menuItem.addActionListener(listener);
    menu.add(menuItem);
    private void addToggleMenuItem(JMenu menu, String command,
    ActionListener listener, boolean selected) {
    JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(command);
    menuItem.setSelected(selected);
    menuItem.addActionListener(listener);
    menu.add(menuItem);
    private class MenuHandler implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
    String comm = evt.getActionCommand();
    if (comm.equals("new Standard")) {
    nim=new int[3];
    nim[0]=1;
    nim[1]=2;
    nim[2]=3;
    game.changeGame(nim);
    else if (comm.equals("new Standard4")) {
    nim=new int[4];
    nim[0]=1;
    nim[1]=2;
    nim[2]=3;
    nim[3]=4;
    game.changeGame(nim);
    else if (comm.equals("new Custom3")) {   
    nim=new int[3];
    response = JOptionPane.showInputDialog(null,"Enter the # of lines for row1");
    nim[0]=Integer.parseInt(response);
    response1 = JOptionPane.showInputDialog(null,"Enter the # of lines for row2");
    nim[1]=Integer.parseInt(response1);
    response2 = JOptionPane.showInputDialog(null,"Enter the # of lines for row3");
    nim[2]=Integer.parseInt(response2);
    game.changeGame(nim);
    else if (comm.equals("Images")) {
    imgBool=true;
    else if (comm.equals("Rectangles")) {
    imgBool=false;
    *else if (comm.equals("Quit")) {*
    System.exit(0);
    mainPanel.repaint();
    public class NIM extends JPanel
    private int [] nimStuff;
    private ArrayList<Cord> points=new ArrayList<Cord> ();
    public NIM(int [] array){
    nimStuff=new int[array.length];
    nimStuff=array;
    public void changeGame(int [] array) {
    nimStuff=new int[array.length];
    nimStuff=array;
    public void check(int x,int y) {
    for (Cord temp: points) {
    if(x<=temp.getX()+30 && x>=temp.getX() && y<=temp.getY()+35 && y>=temp.getY()) {
    int h=temp.getRow();
    int h1=nimStuff[h];
    nimStuff[h]=h1-temp.getHow();
    break;
    points.clear();
    public void drawMe(Graphics g) {
    int yc=0;
    if(!imgBool) {
    g.setColor(Color.BLACK);
    for(int ind=0; ind<nimStuff.length; ind++) {
    yc+=50;
    int var=nimStuff[ind];
    for(int len=1;len<=var;len++) {
    g.fillRect(len*45,yc,30,35);
    points.add(new Cord(len*45,yc,ind,var-len));
    else if (imgBool) {
    for(int ind=0; ind<nimStuff.length; ind++) {
    yc+=50;
    int var=nimStuff[ind];
    for(int len=1;len<=var;len++) {
    g.drawImage(img,len*45,yc,30,35,this);
    points.add(new Cord(len*45,yc,ind,var-len));
    public class Cord {
    int x;
    int y;
    int sub;
    int num;
    public Cord(int one,int two,int row,int col) {
    x=one;
    y=two;
    sub=row;
    num=col+1;
    public int getX() {
    return x;
    public int getY() {
    return y;
    public int getRow() {
    return sub;
    public int getHow() {
    return num;

    MikeMun wrote:
    Yes, I understand that. Okay then.
    But i am witting this code on a java IDE called blueJ. So what?
    It should be possible within the blueJ.Why and more importantly who cares?
    So it's something in my code that's wrong.What is wrong is your understanding. You can't call exit in an applet. End of story. Who cares what it does in an IDE. Why could this possibly matter? There is no point to having something "work" in an IDE that will never work in the wild.

  • How can i plot a histogram with using the results of Line Length

    PLS HELP.How can i prepare a histogram with using the results of line length code(It is somewhere in the middle).
    This is a final exam take-home question. I would appreciate if you can help?
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    import java.text.*;
    import java.io.File;
    public class WordAnalyser extends JFrame implements ActionListener
    private JMenuItem jmiAc, jmiSil, jmiCikis, jmiAnaliz, jmiHakkinda, jmiKullanim;
    private JTextArea jta1, jta2;
    private JFileChooser jFileChooser = new JFileChooser();
    File hafizada;
    File aktarilan = new File("Sonuc.txt");
    // Main method
    public static void main(String[] args)
    WordAnalyser frame = new WordAnalyser(); /* Ana ekran olusturulur */
    frame.setSize(400, 300); /* Degerleri belirlenir */
    frame.setVisible(true); /* Gorunebilirligi ayarlanir */
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    public WordAnalyser()
    setTitle("Serkan Ozgen Dosya Inceleme Programina Hos Geldiniz");
    JMenuBar mb = new JMenuBar();
    setJMenuBar(mb);
    JMenu fileMenu = new JMenu("Dosya");
    fileMenu.setMnemonic('F');
    mb.add(fileMenu);
    JMenu helpMenu = new JMenu("Degerlendirme");
    helpMenu.setMnemonic('H');
    mb.add(helpMenu);
    JMenu kullanimMenu = new JMenu("Kullanim Kilavuzu");
    mb.add(kullanimMenu);     
    fileMenu.add(jmiAc = new JMenuItem("Ac", 'A'));
    fileMenu.add(jmiSil = new JMenuItem("Sil", 'S'));
    fileMenu.add(jmiCikis = new JMenuItem("Cikis", 'C'));
    helpMenu.add(jmiAnaliz = new JMenuItem("Analiz", 'D'));
    helpMenu.add(jmiHakkinda = new JMenuItem("Hakkinda", 'H'));
    kullanimMenu.add(jmiKullanim = new JMenuItem("Kullanim"));     
    getContentPane().add(new JScrollPane(jta1 = new JTextArea()), BorderLayout.CENTER);
    getContentPane().add(jta2 = new JTextArea(), BorderLayout.SOUTH);
    jmiAc.addActionListener(this);
    jmiSil.addActionListener(this);
    jmiCikis.addActionListener(this);
    jmiAnaliz.addActionListener(this);
    jmiHakkinda.addActionListener(this);
    jmiKullanim.addActionListener(this);
    public void actionPerformed(ActionEvent e)
    String actionCommand = e.getActionCommand();
    if (e.getSource() instanceof JMenuItem)
    if ("Ac".equals(actionCommand))
    Ac();
    else if ("Sil".equals(actionCommand))
    Sil();
    else if ("Cikis".equals(actionCommand))
    System.exit(0);
    else if ("Analiz".equals(actionCommand))
    sayim();
    else if ("Hakkinda".equals(actionCommand))
    JOptionPane.showMessageDialog(this,
    "!!!! Bu program text analizi gerceklestirir. Her hakki saklidir SERKAN OZGEN!!!!",
    "Bu program hakkinda",
    JOptionPane.INFORMATION_MESSAGE);
    else if ("Kullanim".equals(actionCommand))
         JOptionPane.showMessageDialog(this,
         " Ilk once dosya menusunden Ac i tiklayarak analiz etmek istediginiz Dosyayi seciniz (Lutfen uzantisi *.txt \nveya *.log olsun). Daha sonra Degerlendirme menusunden analizi tiklarsaniz dosyanizda kac adet rakam, harf, \ncumle ve kelime oldugunu gorebilirsiniz. Simdiden kolay gelsin",
         "Programin kullanim detaylari",
         JOptionPane.INFORMATION_MESSAGE);
    private void Ac()
    if (jFileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
    hafizada = jFileChooser.getSelectedFile();
    Ac(hafizada);
    // Acilan Dosyayi ana ekranda gostermeye yariyan bir method
    private void Ac(File file)
    try
    // Acilan dosyayi okuma ve ana ekranda gosterme
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
    byte[] b = new byte[in.available()];
    in.read(b, 0, b.length);
    jta1.append(new String(b, 0, b.length));
    in.close();
    catch (IOException ex)
    // Temizle tusunun hangi ekranlara etki edecegini secme
    private void Sil()
    jta1.setText("");
    jta2.setText("");
    private void sayim()
    int buff;
    int sayac = 0;
    int Cumleler = 0;
    int Kelimeler = 0;
    int Karakterler = 0;
    int Satirlar = 0;
    int Rakamlar = 0;     
    boolean start = true;
    int linenum = 0;     
    try
    FileInputStream instream = new FileInputStream(hafizada);
    FileOutputStream outstream = new FileOutputStream(aktarilan);
         BufferedReader infile = new BufferedReader(new InputStreamReader(new FileInputStream(hafizada)));
    PrintStream out = new PrintStream(outstream);
         out.println("---Kelime Avcisinin Sonuclari---");
         String line = infile.readLine();
         while (line != null){
         int len = line.length();
         linenum++;
         line = infile.readLine();
         out.println("Line Length :"     + linenum + "\t" +len);
    while ((buff=instream.read()) != -1)
    switch((char)buff)
    case '?': case '.': case '!': /* Eger "?", "." veya "!" gorurse program cumleleri ve kelimeleri arttirir*/
    if (start == false)
    Cumleler++;
    Kelimeler++;
    start = true;
    break;
    case ' ': case '\t': case ',': case ';': case ':': case'\"': case'\'': /* Eger /t,;:\ ve \" bu isarteleri goruruse program kelimeleri arttirir */
    if (start == false)
    Kelimeler++;
    start = true;
    break;
              case 'n': case '\n': /* Eger \n gorurse satirlari arttirir */
              if (start == false)
                   Satirlar++;
                   Kelimeler++;
                   start = true;
              break;
    default:
    if (((char)buff >= 'a' && (char)buff<='z')|| /*a-z, A-Z veya - degerlerini gorurse karakterler arttirilir */
    ((char)buff >= 'A' && (char)buff<='Z')||
    ((char)buff == '-'))
    Karakterler++;
    if ((Kelimeler % 50) == 49)
    if (start == true)
                   out.println();     
    out.print((Kelimeler+1) + " ");
    out.print((char)buff);
    start = false;
              if ((char)buff >='0' && (char)buff <='9') {  /* 0-9 gorurse rakamlari arttiri */
                   Rakamlar++; }
    }// switch
         }//while
    instream.close();
    out.println();
    out.println();
    out.println("Karakter sayisi: " + Karakterler);
         out.println("Kelime sayisi: " + Kelimeler);
    out.println("Cumle sayisi: " + Cumleler);
         out.println("Satir sayisi: "+ Satirlar);
         out.println("Rakam sayisi: "+ Rakamlar);
    outstream.close();
    try
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(aktarilan));
    byte[] b = new byte[in.available()];
    in.read(b, 0, b.length);
    jta2.append(new String(b, 0, b.length));
    in.close();
    catch (IOException ex)
    catch (Exception e)
    System.out.println(e);
    }

    Why is it that you're not interested in IOExceptions?
    catch (IOException ex)
    } Empty catch blocks is a hallmark of foolish Java code. At least print out the stack trace.
    %

  • Menue item is not visible

    heloo
    this is code for My jframe
    i try to put file menu and i put it in but there is problem and drop menue is not visible but it dos work (if u now where the items are )and
    if you have no idea then is it possible to create 3 different menue and ask action performed to look at there event instead of Jmenue item.
    because if i cant find solution then thats my only way
    bu how should i ask for actionPerforme to listen to them.
    class ChessMa extends JFrame implements ActionListener {
    JMenuItem item;
    JMenu m;
    JMenuBar bar;
    public ChessMa()
    {  setTitle("CHESS PLAYER GAME" );
    setSize(400,490);
         addWindowListener(new java.awt.event.WindowAdapter() {
         public void windowClosing(java.awt.event.WindowEvent e) {
    System.exit(0);
    JMenu m= new JMenu ( "File");
    m.addActionListener(this);
    m.setPopupMenuVisible(true);
    item =new JMenuItem("Save");
    item.addActionListener(this);
    m.add(item);
    repaint();
    item=new JMenuItem("Load");
    item.addActionListener(this);
    m.add(item);
    JMenuBar bar = new JMenuBar () ;
    bar.add(m) ;
    setJMenuBar(bar);
    public void actionPerformed(ActionEvent e)
         //if (e .getSource() instanceof item)
    String arg= e.getActionCommand();
    if (arg.equals("Save"))
              { System.out.println("save");}
         else if (arg.equals("Load"))
              {System.out.println("load");}
         else if (arg.equals("File"))
              {System.out.println("���22222222���!!");}
    public class ChessMan{
    public static void main(String[] args) {
    JFrame frame = new ChessMa();
    ImageIcon customImageIcon = new ImageIcon("ac516.gif");
              Image customImage = customImageIcon.getImage();
              frame.setIconImage(customImage);
              // Japplet Class
    ChessPlayer javaAppletication = new ChessPlayer();
              javaAppletication.init();
    javaAppletication.start();
              Container content = frame.getContentPane();
         content.add(javaAppletication, BorderLayout.CENTER);
    javaAppletication.setBackground (Color.black);
         frame.setVisible(true);
    frame.show();
    frame.pack(); // invokes getPreferredSize()
    // invokes paint();
    }

    Hi,
    I think you want your file menu to be visible as soon as your frame opens. If I'm correct, then you can run the code pasted below. You were trying to make file menu visible when it was not showing.
    Best regards,
    Pratap
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class ChessMa extends JFrame implements ActionListener, WindowListener {
         JMenuItem item;
         JMenu m;
         JMenuBar bar;
         public ChessMa()
              setTitle("CHESS PLAYER GAME" );
              setSize(400,490);
              addWindowListener(new java.awt.event.WindowAdapter() {
                   public void windowClosing(java.awt.event.WindowEvent e) {
                   System.exit(0);
              m= new JMenu ( "File");
              m.addActionListener(this);
              m.setPopupMenuVisible(true);
              item =new JMenuItem("Save");
              item.addActionListener(this);
              m.add(item);
              repaint();
              item=new JMenuItem("Load");
              item.addActionListener(this);
              m.add(item);
              JMenuBar bar = new JMenuBar () ;
              bar.add(m) ;
              setJMenuBar(bar);
              addWindowListener(this);
         public void actionPerformed(ActionEvent e)
              //if (e .getSource() instanceof item)
              String arg= e.getActionCommand();
              if (arg.equals("Save"))
                   System.out.println("save");
              else
              if (arg.equals("Load"))
                   System.out.println("load");
              else
              if (arg.equals("File"))
                   System.out.println("���22222222���!!");
         public static void main(String[] args) {
              ChessMa f = new ChessMa();
              f.setLocation(300,300);
              f.show();
         public void windowOpened(WindowEvent e) {
              m.doClick();
         public void windowClosing(WindowEvent e) {}
         public void windowClosed(WindowEvent e) {}
         public void windowIconified(WindowEvent e) {}
         public void windowDeiconified(WindowEvent e) {}
         public void windowActivated(WindowEvent e) {}
         public void windowDeactivated(WindowEvent e) {}
    }

  • How to add event handling for a menu?

    hi,
    I have created a menu and few mneu items.
    for eachmenu itme , i did event handling and it is workign fine.
    it was like this
    menuItem = new JMenuItem("Exit",KeyEvent.VK_X);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
    menuItem.addActionListener(this);
    menu.add(menuItem);
         public void actionPerformed(ActionEvent e)
    JMenuItem source = (JMenuItem)(e.getSource());
    String s = "Action event detected. Event source: " + source.getText();
    System.out.println(s);     
    public void itemStateChanged(ItemEvent e)
    JMenuItem source = (JMenuItem)(e.getSource());
    String s = "Item event detected. Event source: " + source.getText();
    System.out.println(s);
    now int he second menu i don't have any menu item and i want to do the event handling for the menu itself. any ideas how to do it. following is the code for the menu
    //Build the second menu.
    menu2 = new JMenu("Options");
    menu2.setMnemonic(KeyEvent.VK_O);
    menuBar.add(menu2);
    menu2.addActionListener(this);     //this does nto work

    You were on the right track. However, selecting a menu is different from selecting a menu item. MenuItem chucks an ActionEvent and Menu will send an ItemEvent.
    If you pile all action output to one actionPerformed method then be careful of your assumptions on what the source type will be. If by any chance the Menu has sent an ActinoEvent then your code will have caused a ClassCastException.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class MenuTest implements ActionListener, ItemListener {
        JMenuItem menuItem;
        JMenu menu1, menu2;
        JMenuBar menubar;
        JFrame frame;
        public MenuTest() {
            frame = new JFrame("MenuTest");
            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
            menubar = new JMenuBar();
            frame.setJMenuBar(menubar);
            menu1 = new JMenu("File");
            menu1.setMnemonic(KeyEvent.VK_F);
            menuItem = new JMenuItem("Exit",KeyEvent.VK_X);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
            menuItem.addActionListener(this);
            menu1.addItemListener(this);
            menu1.add(menuItem);
            menubar.add(menu1);
            //Build the second menu.
            menu2 = new JMenu("Options");
            menu2.setMnemonic(KeyEvent.VK_O);
            menu2.addActionListener(this); //this does not work
            menu2.addItemListener(this); // use this instead
            menubar.add(menu2);
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(100,100));
            frame.getContentPane().add(panel);
            frame.pack();
            frame.show();
        public void actionPerformed(ActionEvent e)
            String s = "Action event detected. Event source: " + e.getSource();
            System.out.println(s);
        public void itemStateChanged(ItemEvent e)
            String s = "Item event detected. Event source: " + e.getSource();
            System.out.println(s);
        public static void main(String[] args) {
            new MenuTest();
    }

  • Changing mouse pointer using setCursor()

    Hi- I've got a single threaded JFrame-based application in which I want to change the mouse pointer to indicate 'busy' when it's doing stuff eg. loading a file. So within my extended JFrame method for handling menu selections I've got:
    public class Layout extends JFrame
        // For items in the main menu
        // (the sub-class contains either a JMenuItem or JCheckBoxMenuItem).
        abstract class MenuItem implements ActionListener
            abstract JMenuItem menuItemAbs(); // get the menu item component
            abstract void handlerAbs(); // perform the menu's action
            // Menu item has been selected.
            public void actionPerformed(ActionEvent e)
                Cursor cursor = Layout.this.getCursor();
                Layout.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                handlerAbs();
                Layout.this.setCursor(cursor);
            }But the mouse pointer doesn't always change. If handler() just does some processing without user interaction, the pointer does change. But in the case of loading a file, where first the user selects the file using a JFileChooser, it doesn't.
    Is this because JFileChooser does its own setCursor()? But even if it does, presumably it does another setCursor() to restore my WAIT_CURSOR before it returns, so why don't I see the WAIT_CURSOR while the file is loading (which takes seconds)?
    Cheers
    John
    EDIT: BTW running under Linux, Java v6 update 7
    Edited by: matth1j on Nov 12, 2008 2:15 AM

    Ok, thanks - full demo program below.
    When you hit the ok button (just 5 second sleep), the mouse pointer changes to 'busy'. It reverts to normal if you move the pointer off the frame, but goes back to 'busy' if you move it back onto the frame.
    When you hit the bad button (brings up file chooser, then does 5 second sleep), the pointer changes to 'busy' while the pointer is over the frame, and reverts to normal when the pointer is moved off the frame. But if you select a file or cancel the file chooser and move the pointer back into the main frame before the 5 seconds is up, the pointer doesn't go back to 'busy' again. I would expect it to show 'busy' while over the frame until the 5 seconds is up.
    Any ideas?
    package test;
    import java.awt.Cursor;
    import java.awt.EventQueue;
    import java.awt.event.*;
    import javax.swing.*;
    public class Main
        public static void main(String[] args)
            EventQueue.invokeLater(new Runnable()
                public void run()
                    new Test();
    class Test extends JFrame
        public Test()
            super();
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.add(new Button("ok"));
            panel.add(new Button("bad"));
            add(panel);
            pack();
            repaint();
            setVisible(true);
        class Button extends JButton implements ActionListener
            Button(String text)
                super(text);
                addActionListener(this);
            public void actionPerformed(ActionEvent e)
                Cursor cursor = Test.this.getCursor();
                Test.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                if (!e.getActionCommand().equals("ok"))
                    (new JFileChooser()).showOpenDialog(null);
                try
                    Thread.sleep(5000);
                catch (Exception ex)
                    ex.printStackTrace();
                Test.this.setCursor(cursor);
    }Edited by: matth1j on Nov 12, 2008 2:44 AM code tidy
    Edited by: matth1j on Nov 12, 2008 2:45 AM code tidy

  • Memory Leak with JPopupMenu

    It seems there is a memory leak with JPopupMenu. The following program demonstrates this leak. If you run the program, click on show form, and then close the form, the used memory will be GCd appropriately. If you click on show form, then right click on the table to show the popup (even if you dont do anything else with the popup) then close the form, it never GCs the form. I've tried all kinds of crazy things, but I cant seem to find what is keeping the memory from being GCd.
    Peter
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.beans.PropertyChangeListener;
    import java.text.DecimalFormat;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.Vector;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JRadioButtonMenuItem;
    import javax.swing.JScrollPane;
    import javax.swing.JTabbedPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.AbstractTableModel;
    @SuppressWarnings("serial")
    public class TriState extends JPanel {
         private static final long               K               = 1024;
         private static final long               M               = K * K;
         private static final long               G               = M * K;
         private static final long               T               = G * K;
         protected static int ctr = 1;
         private JButton                              btnShow          = new JButton("Show Form");
         private JLabel                              lblMem          = new JLabel();
         private static final DecimalFormat     df               = new DecimalFormat("#,##0.#");
         protected Timer                              updateTimer     = new Timer();
         public TriState() {
              this.setLayout(new GridLayout());
              add(btnShow);
              add(lblMem);
              updateTimer.scheduleAtFixedRate(new UpdateTimerTask(), 1000, 1000);
              btnShow.addActionListener(new ActionListener() {
                   @Override
                   public void actionPerformed(ActionEvent e) {
                        FrmReferrals fr = new FrmReferrals();
                        fr.setVisible(true);
         class UpdateTimerTask extends TimerTask {
              public void run() {
                   SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                             dumpMemoryUsage();
         protected void dumpMemoryUsage() {
              System.gc();
              Long t = Runtime.getRuntime().totalMemory();
              long f = Runtime.getRuntime().freeMemory();
              String st = convertToStringRepresentation(t);
              String sf = convertToStringRepresentation(f);
              String su = convertToStringRepresentation(t - f);
              System.out.println("Total:" + st + "(" + t + ") Free:" + sf + "(" + f + ") Used:" + su + "(" + (t - f) + ")");
              lblMem.setText(su + "/" + st);
         public static String convertToStringRepresentation(final long value) {
              final long[] dividers = new long[]{T, G, M, K, 1};
              final String[] units = new String[]{"TB", "GB", "MB", "KB", "B"};
              if (value < 1)
                   throw new IllegalArgumentException("Invalid file size: " + value);
              String result = null;
              for (int i = 0; i < dividers.length; i++) {
                   final long divider = dividers;
                   if (value >= divider) {
                        final double dr = divider > 1 ? (double) value / (double) divider : (double) value;
                        result = df.format(dr) + units[i];
                        break;
              return result;
         private static void createAndShowGUI() {
              JFrame frame = new JFrame("SimpleTableDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              // Create and set up the content pane.
              TriState newContentPane = new TriState();
              newContentPane.setOpaque(true); // content panes must be opaque
              frame.setContentPane(newContentPane);
              // Display the window.
              frame.pack();
              frame.setVisible(true);
         public static void main(String[] args) {
              javax.swing.SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                        createAndShowGUI();
         protected class PopupMenu extends JPopupMenu {
              public PopupMenu() {
                   JRadioButtonMenuItem item1 = new JRadioButtonMenuItem(new AbstractAction("Insert Item") {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                             System.out.println(e.getActionCommand());
                   item1.setActionCommand("Insert");
                   add(item1);
                   JRadioButtonMenuItem item2 = new JRadioButtonMenuItem(new AbstractAction("Delete Item") {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                             System.out.println(e.getActionCommand());
                   item2.setActionCommand("Delete");
                   add(item2);
         public class FrmReferrals extends JFrame {
              public FrmReferrals() {
                   super();
                   init();
              protected void init() {
                   jbInit();
              protected void closeIt() {
                   uninit();
              // variables here
              protected Dimension          dimPreferred     = new Dimension(1270, 995);
              protected JTabbedPane     tabbedPane          = new JTabbedPane();
              protected JTable          tblReferrals     = null;
              protected PopupMenu          popMenu           = new PopupMenu();
              protected void jbInit() {
                   setPreferredSize(dimPreferred);
                   setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                   setTitle("Referrals");
                   JPanel pnl = new JPanel();
                   pnl.setOpaque(false);
                   pnl.setLayout(new BorderLayout());
                   pnl.add(tabbedPane, BorderLayout.CENTER);
                   // put it all in the frame
                   add(pnl);
                   pack();
                   setLocationRelativeTo(null);
                   // init the table and model
                   ReferralsTableModel ctm = new ReferralsTableModel(buildDummyVector());
                   tblReferrals = new JTable(ctm);
                   tblReferrals.setComponentPopupMenu(popMenu);
                   tblReferrals.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                   tabbedPane.add(new JScrollPane(tblReferrals, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
                   addWindowListener(new WindowListener() {
                        @Override
                        public void windowActivated(WindowEvent e) {}
                        @Override
                        public void windowClosed(WindowEvent e) {}
                        @Override
                        public void windowClosing(WindowEvent e) {
                             closeIt();
                        @Override
                        public void windowDeactivated(WindowEvent e) {}
                        @Override
                        public void windowDeiconified(WindowEvent e) {}
                        @Override
                        public void windowIconified(WindowEvent e) {}
                        @Override
                        public void windowOpened(WindowEvent e) {}
              protected Vector<DBO_Referrals> buildDummyVector() {
                   Vector<DBO_Referrals> vr = new Vector<DBO_Referrals>();
                   for (int x = 0; x < 5000; x++) {
                        DBO_Referrals r = new DBO_Referrals(x+(5000*ctr));
                        vr.add(r);
                   return vr;
              protected void uninit() {
                   tblReferrals.setComponentPopupMenu(null);
                   for (Component c : popMenu.getComponents()) {
                        PropertyChangeListener[] pl = c.getPropertyChangeListeners();
                        for (PropertyChangeListener l : pl)
                             c.removePropertyChangeListener(l);
                        if (c instanceof JMenuItem) {
                             ActionListener [] al = ((JMenuItem)c).getActionListeners();
                             for (ActionListener l : al) {
                                  ((JMenuItem)c).removeActionListener(l);
                   popMenu = null;
              protected class DBO_Referrals {
                   protected long          id;
                   protected String     Employee;
                   protected String     Rep;
                   protected String     Asst;
                   protected String     Client;
                   protected String     Dates;
                   protected String     Status;
                   protected String     Home;
                   public DBO_Referrals(long id) {
                        this.id = id;
                        Employee = "Employee" + id;
                        Rep = "Rep" + id;
                        Asst = "Asst" + id;
                        Client = "Client" + id;
                        Dates = "Dates" + id;
                        Status = "Status" + id;
                        Home = "Home" + id;
                   public long getId() {
                        return id;
                   public String getEmployee() {
                        return Employee;
                   public String getRep() {
                        return Rep;
                   public String getAsst() {
                        return Asst;
                   public String getClient() {
                        return Client;
                   public String getDates() {
                        return Dates;
                   public String getStatus() {
                        return Status;
                   public String getHome() {
                        return Home;
              public class ReferralsTableModel extends AbstractTableModel {
                   protected Vector<DBO_Referrals>          data          = new Vector<DBO_Referrals>();
                   protected String[]                         sColumns     = {"id", "Employee", "Rep", "Assistant", "Client", "Date", "Status", "Home", "R"};
                   public ReferralsTableModel() {
                        super();
                   public ReferralsTableModel(Vector<DBO_Referrals> data) {
                        this();
                        this.data = data;
                   @SuppressWarnings("unchecked")
                   @Override
                   public Class getColumnClass(int col) {
                        switch (col) {
                             case 0 :
                                  return Long.class;
                             default :
                                  return String.class;
                   @Override
                   public int getColumnCount() {
                        return sColumns.length;
                   @Override
                   public int getRowCount() {
                        return data.size();
                   @Override
                   public Object getValueAt(int row, int col) {
                        if (row > data.size())
                             return null;
                        DBO_Referrals a = data.get(row);
                        switch (col) {
                             case 0 :
                                  return a.getId();
                             case 1 :
                                  return a.getEmployee();
                             case 2 :
                                  return a.getRep();
                             case 3 :
                                  return a.getAsst();
                             case 4 :
                                  return a.getClient();
                             case 5 :
                                  return a.getDates();
                             case 6 :
                                  return a.getStatus();
                             case 7 :
                                  return a.getHome();
                             case 8 :
                                  return "+";
                             default :
                                  return null;

    BTW instead of continually printing out the memory use a profiler (jvisualvm in the jdk/bin directory -> heapdump -> search on your class -> view in instances -> find nearest GC root).
    Looks like BasicPopupMenuUI doesn't remove a reference to the JRootPane immediately. As far as I can see it will be removed when another menu shows.
    As a hackish workaround you can try this in you FrmReferrals#uninit():
                for(ChangeListener listener : MenuSelectionManager.defaultManager().getChangeListeners()) {
                    if (listener.getClass().getName().contains("MenuKeyboardHelper")) {
                        try {
                            Field field = listener.getClass().getDeclaredField("menuInputMap");
                            field.setAccessible(true);
                            field.set(listener, null);
                        } catch (Exception e) {
                            // ignored
                        break;
                }Funnily enough though it isn't there when I reduce your code to a SSCCE:
    import java.awt.*;
    import javax.swing.*;
    public class TestBasicPopupMenuUILeak extends JFrame {
        public TestBasicPopupMenuUILeak() {
            super("Not collected right away");
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.getContentPane().add(
                            new JButton(new AbstractAction("Show frame") {
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                    EventQueue.invokeLater(new Runnable() {
                                        public void run() {
                                            JLabel label = new JLabel(
    "Right click to show popup, then close this frame."
    + "The frame with not be GCed until another (popup) menu is shown.");
                                            JPopupMenu popup = new JPopupMenu(
                                                    "Popup");
                                            popup.add("Item");
                                            label.setComponentPopupMenu(popup);
                                            // named differently so you can find it
                                            // easily in your favorite profiler
                                            JFrame frame = new TestBasicPopupMenuUILeak();
                                            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                                            frame.getContentPane().add(label);
                                            frame.pack();
                                            frame.setLocationRelativeTo(null);
                                            frame.setVisible(true);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    }

  • Calling a method(application) after the login screen

    Sorry for reposting this, but if you've read my other posts, I've managed to solve the stack overflow error. Now here's the problem, I get a successful login but the second application will not appear, I just get the login screen reappearing again. Here's the code:
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class EmailForms extends JFrame implements ActionListener {
         private JTextField jtfUserName;
         private JPasswordField jpfPassword;
         private JButton jbtLogin;
         private JButton jbtCancel;
         public JMenuItem jmiLogout, jmiAB, jmiBC, jmiMB, jmiSK, jmiNT, jmiNSR, jmiAbout, jmiCapacity;
         private HashMap users;
         public static void main (String[] args) {               
              EmailForms LoginFrame = new EmailForms();
              LoginFrame.setSize(200, 100);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = LoginFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              LoginFrame.setLocation(x, y);
              LoginFrame.pack();
              LoginFrame.setVisible(true);     
         public EmailForms () {     
              users = new HashMap();
              try {     
                   String UP1Line;
                   FileInputStream fis = new FileInputStream("UP1.txt");
                  BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                  while ((UP1Line = br.readLine()) != null) {
                       String [] items = UP1Line.split(" ", 4);
                       users.put(items[0], new String[] { items[1], items[2] });
                    br.close();
                    fis.close();
              catch (IOException ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 1",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
              catch (NullPointerException ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 2",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
              setTitle("E-Forms: Login");
              JPanel jpLoginLabels = new JPanel();
              jpLoginLabels.setLayout(new GridLayout(2, 1));
              jpLoginLabels.add(new JLabel("Username:"));
              jpLoginLabels.add(new JLabel("Password:"));
              JPanel jpLoginText = new JPanel();
              jpLoginText.setLayout(new GridLayout(2, 1));
              jpLoginText.add(jtfUserName = new JTextField(10));
              jpLoginText.add(jpfPassword = new JPasswordField(10));
              JPanel p1 = new JPanel();
              p1.setLayout(new BorderLayout());     
              p1.add(jpLoginLabels, BorderLayout.WEST);
              p1.add(jpLoginText, BorderLayout.CENTER);
              JPanel p2 = new JPanel();
              p2.setLayout(new FlowLayout(FlowLayout.CENTER));     
              p2.add(jbtLogin = new JButton("Login"));
              p2.add(jbtCancel = new JButton("Cancel"));     
              getContentPane().setLayout(new BorderLayout());
              getContentPane().add(p1, BorderLayout.CENTER);
              getContentPane().add(p2, BorderLayout.SOUTH);
              jbtLogin.addActionListener(this);
              jbtCancel.addActionListener(this);
         public void actionPerformed(ActionEvent e) {
              try {
                   UserEForms myUser = new UserEForms();
                   AdminEForms myAdmin = new AdminEForms();
                   String arg = e.getActionCommand();
                   if (arg.equals("Cancel")) {
                        System.exit(0);
                        arg = "";
                   if (arg.equals("Login")) {
                        int index = find(jtfUserName.getText().trim(), new String(jpfPassword.getPassword()));
                        if (index == -1) {
                             JOptionPane.showMessageDialog(this, "Username/Password Not Found", "Email Forms: Login Error",
                             JOptionPane.INFORMATION_MESSAGE);
                        else {
                             if (index == 1 ){
                                  myAdmin.AdminSide();
                             else {
                                  myUser.UserSide();          
                   arg = "";
              catch (StackOverflowError ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 1",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
         public int find(String UName, String PWord) {
              String[] creds = (String[])users.get((Object)UName);
              if (creds != null && creds[0].matches(PWord)) {
                   if (creds[1].matches("[Yy]"))
                        return 1;
                   else
                        return 0;
              return -1;
    } import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class AdminEForms extends EmailForms {
         public AdminEForms() {     
         public void AdminSide() {
              System.out.println("1");
              AdminEForms AdminFrame = new AdminEForms();
              AdminFrame.setSize(500, 600);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = AdminFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              AdminFrame.setLocation(x, y);
              AdminFrame.pack();
              AdminFrame.setVisible(true);     
              setTitle("Admin Email Forms");
              JMenuBar jmb = new JMenuBar();
               setJMenuBar(jmb);
              JMenu jmFile = new JMenu("File");
              jmb.add(jmFile);
              JMenu jmAdmin = new JMenu("Administration");
              jmb.add(jmAdmin);
              JMenu jmEForms = new JMenu("Email Forms");
              jmb.add(jmEForms);
              JMenu jmHelp = new JMenu("Help");
              jmb.add(jmHelp);
              jmFile.add(jmiLogout = new JMenuItem("Logout"));
              jmAdmin.add(jmiCapacity = new JMenuItem("Capacity Issues"));
              jmEForms.add(jmiAB = new JMenuItem("Alberta"));
              jmEForms.add(jmiBC = new JMenuItem("British Columbia"));
              jmEForms.add(jmiMB = new JMenuItem("Manitoba"));
              jmEForms.add(jmiSK = new JMenuItem("Saskatchwen"));
              jmEForms.add(jmiNT = new JMenuItem("NWT"));
              jmEForms.add(jmiNSR = new JMenuItem("NSR CLLI"));
              jmHelp.add(jmiAbout = new JMenuItem("About"));
              jmiLogout.addActionListener(this);
              jmiCapacity.addActionListener(this);
              jmiAB.addActionListener(this);
              jmiBC.addActionListener(this);
              jmiMB.addActionListener(this);
              jmiSK.addActionListener(this);
              jmiNT.addActionListener(this);
              jmiNSR.addActionListener(this);
              jmiAbout.addActionListener(this);
    } import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class UserEForms extends EmailForms {
         public UserEForms() {     
         public void UserSide() {
              System.out.println("2");
              UserEForms UserFrame = new UserEForms();
              UserFrame.setSize(500, 600);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = UserFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              UserFrame.setLocation(x, y);
              UserFrame.pack();
              UserFrame.setVisible(true);     
              setTitle("User Email Forms");
              JMenuBar jmb = new JMenuBar();
              setJMenuBar(jmb);
              JMenu jmFile = new JMenu("File");
              jmb.add(jmFile);
              JMenu jmEForms = new JMenu("Email Forms");
              jmb.add(jmEForms);
              JMenu jmHelp = new JMenu("Help");
              jmb.add(jmHelp);
              jmFile.add(jmiLogout = new JMenuItem("Logout"));
              jmEForms.add(jmiAB = new JMenuItem("Alberta"));
              jmEForms.add(jmiBC = new JMenuItem("British Columbia"));
              jmEForms.add(jmiMB = new JMenuItem("Manitoba"));
              jmEForms.add(jmiSK = new JMenuItem("Saskatchwen"));
              jmEForms.add(jmiNT = new JMenuItem("NWT"));
              jmEForms.add(jmiNSR = new JMenuItem("NSR CLLI"));
              jmHelp.add(jmiAbout = new JMenuItem("About"));
              jmiLogout.addActionListener(this);
              jmiAB.addActionListener(this);
              jmiBC.addActionListener(this);
              jmiMB.addActionListener(this);
              jmiSK.addActionListener(this);
              jmiNT.addActionListener(this);
              jmiNSR.addActionListener(this);
              jmiAbout.addActionListener(this);
    } I've put System.out.println("1"); and System.out.println("2"); in the code and I can see that it is actually going into the Adminside and Userside methods, but there not appearing. My text file looks like this:
    9876543 9876543 Y
    0612207 0612207 N
    0123456 0123456 N
    1234567 1234567 Y
    Please can someone help me???
    Colin

    Ok, I've got the stackoverflow thing figured out. My program runs, but when it goes into either the admin or the user methods the buttons from the login methods are still visible. I've done some reading in the forums about dispose() and setVisible(false) and I've tried using them without success. Here's the code:
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class EmailForms extends JFrame implements ActionListener {
         private JTextField jtfUserName;
         private JPasswordField jpfPassword;
         private JButton jbtLogin;
         private JButton jbtCancel;
         private HashMap users;
         public static void main (String[] args) {               
              EmailForms LoginFrame = new EmailForms();
              LoginFrame.setSize(200, 100);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = LoginFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              LoginFrame.setLocation(x, y);
              LoginFrame.pack();
              LoginFrame.setVisible(true);     
         public EmailForms () {     
              users = new HashMap();
              try {     
                   String UP1Line;
                   FileInputStream fis = new FileInputStream("UP1.txt");
                  BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                  while ((UP1Line = br.readLine()) != null) {
                       String [] items = UP1Line.split(" ", 4);
                       users.put(items[0], new String[] { items[1], items[2] });
                    br.close();
                    fis.close();
              catch (IOException ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 1",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
              catch (NullPointerException ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 2",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
              setTitle("E-Forms: Login");
              JPanel jpLoginLabels = new JPanel();
              jpLoginLabels.setLayout(new GridLayout(2, 1));
              jpLoginLabels.add(new JLabel("Username:"));
              jpLoginLabels.add(new JLabel("Password:"));
              JPanel jpLoginText = new JPanel();
              jpLoginText.setLayout(new GridLayout(2, 1));
              jpLoginText.add(jtfUserName = new JTextField(10));
              jpLoginText.add(jpfPassword = new JPasswordField(10));
              JPanel p1 = new JPanel();
              p1.setLayout(new BorderLayout());     
              p1.add(jpLoginLabels, BorderLayout.WEST);
              p1.add(jpLoginText, BorderLayout.CENTER);
              JPanel p2 = new JPanel();
              p2.setLayout(new FlowLayout(FlowLayout.CENTER));     
              p2.add(jbtLogin = new JButton("Login"));
              p2.add(jbtCancel = new JButton("Cancel"));     
              getContentPane().setLayout(new BorderLayout());
              getContentPane().add(p1, BorderLayout.CENTER);
              getContentPane().add(p2, BorderLayout.SOUTH);
              jbtLogin.addActionListener(this);
              jbtCancel.addActionListener(this);
         public void actionPerformed(ActionEvent e) {
              try {
                   UserEForms myUser = new UserEForms();
                   AdminEForms myAdmin = new AdminEForms();
                   String arg = e.getActionCommand();
                   if (arg.equals("Cancel")) {
                        System.exit(0);
                        arg = "";
                   if (arg.equals("Login")) {
                        int index = find(jtfUserName.getText().trim(), new String(jpfPassword.getPassword()));
                        if (index == -1) {
                             JOptionPane.showMessageDialog(this, "Username/Password Not Found", "Email Forms: Login Error",
                             JOptionPane.INFORMATION_MESSAGE);
                        else {
                             if (index == 1 ){
                                  myAdmin.AdminSide();
                             else {
                                  myUser.UserSide();          
                   arg = "";
              catch (StackOverflowError ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 1",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
              catch (NullPointerException ex){
                   JOptionPane.showMessageDialog(this, "Fatal Systems Error", "Email Forms: File Error 2",
                   JOptionPane.INFORMATION_MESSAGE);
                   System.exit(0);     
         public int find(String UName, String PWord) {
              String[] creds = (String[])users.get((Object)UName);
              if (creds != null && creds[0].matches(PWord)) {
                   if (creds[1].matches("[Yy]"))
                        return 1;
                   else
                        return 0;
              return -1;
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class AdminEForms extends EmailForms implements ActionListener {
         public JMenuItem jmiLogout, jmiAB, jmiBC, jmiMB, jmiSK, jmiNT, jmiNSR, jmiAbout, jmiCapacity;
         public AdminEForms() {          
              setTitle("Admin Email Forms");
              JMenuBar jmb = new JMenuBar();
               setJMenuBar(jmb);
              JMenu jmFile = new JMenu("File");
              jmb.add(jmFile);
              JMenu jmAdmin = new JMenu("Administration");
              jmb.add(jmAdmin);
              JMenu jmEForms = new JMenu("Email Forms");
              jmb.add(jmEForms);
              JMenu jmHelp = new JMenu("Help");
              jmb.add(jmHelp);
              jmFile.add(jmiLogout = new JMenuItem("Logout"));
              jmAdmin.add(jmiCapacity = new JMenuItem("Capacity Issues"));
              jmEForms.add(jmiAB = new JMenuItem("Alberta"));
              jmEForms.add(jmiBC = new JMenuItem("British Columbia"));
              jmEForms.add(jmiMB = new JMenuItem("Manitoba"));
              jmEForms.add(jmiSK = new JMenuItem("Saskatchwen"));
              jmEForms.add(jmiNT = new JMenuItem("NWT"));
              jmEForms.add(jmiNSR = new JMenuItem("NSR CLLI"));
              jmHelp.add(jmiAbout = new JMenuItem("About"));
              jmiLogout.addActionListener(this);
              jmiCapacity.addActionListener(this);
              jmiAB.addActionListener(this);
              jmiBC.addActionListener(this);
              jmiMB.addActionListener(this);
              jmiSK.addActionListener(this);
              jmiNT.addActionListener(this);
              jmiNSR.addActionListener(this);
              jmiAbout.addActionListener(this);     
         public void AdminSide() {
              AdminEForms AdminFrame = new AdminEForms();
              AdminFrame.setSize(1000, 800);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = AdminFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              AdminFrame.setLocation(x, y);
              AdminFrame.setVisible(true);     
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class UserEForms extends EmailForms implements ActionListener {
         public JMenuItem jmiLogout, jmiAB, jmiBC, jmiMB, jmiSK, jmiNT, jmiNSR, jmiAbout;
         public UserEForms() {     
              setTitle("User Email Forms");
              JMenuBar jmb = new JMenuBar();
              setJMenuBar(jmb);
              JMenu jmFile = new JMenu("File");
              jmb.add(jmFile);
              JMenu jmEForms = new JMenu("Email Forms");
              jmb.add(jmEForms);
              JMenu jmHelp = new JMenu("Help");
              jmb.add(jmHelp);
              jmFile.add(jmiLogout = new JMenuItem("Logout"));
              jmEForms.add(jmiAB = new JMenuItem("Alberta"));
              jmEForms.add(jmiBC = new JMenuItem("British Columbia"));
              jmEForms.add(jmiMB = new JMenuItem("Manitoba"));
              jmEForms.add(jmiSK = new JMenuItem("Saskatchwen"));
              jmEForms.add(jmiNT = new JMenuItem("NWT"));
              jmEForms.add(jmiNSR = new JMenuItem("NSR CLLI"));
              jmHelp.add(jmiAbout = new JMenuItem("About"));
              jmiLogout.addActionListener(this);
              jmiAB.addActionListener(this);
              jmiBC.addActionListener(this);
              jmiMB.addActionListener(this);
              jmiSK.addActionListener(this);
              jmiNT.addActionListener(this);
              jmiNSR.addActionListener(this);
              jmiAbout.addActionListener(this);
         public void UserSide() {
              UserEForms UserFrame = new UserEForms();
              UserFrame.setSize(1000, 800);
              Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
              int screenWidth = screenSize.width;
              int screenHeight = screenSize.height;
              Dimension frameSize = UserFrame.getSize();
              int x = (screenWidth - frameSize.width)/2;
              int y = (screenHeight - frameSize.height)/2;
              UserFrame.setLocation(x, y);
              UserFrame.setVisible(true);     
    }I'm thinking on using setVisible(false), but then again seeing that the login method isn't being used once you have a successful login, the dispose() method would be better. If you copy and paste my program, you'll clearly see my problem. Thanks.
    Text file:
    9876543 9876543 Y
    0612207 0612207 N
    0123456 0123456 N
    1234567 1234567 Y
    Colin

  • Moving initializations to a method generates nullpointer exceptions

    Hi,
    I'm trying to tidy up some code in a class that extends JMenuBar, but I keep getting NullPointerExceptions. Honestly, I have no idea why the compiler doesn't recognized the objects I have just initialized.
    See this:
    (a couple more questions added in comments)
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.util.ArrayList;
    import javax.swing.*;
    public class MyMenuBar extends JMenuBar implements ActionListener
         private JMenuItem exitItem, newGameItem, stopGameItem;
         private JRadioButton shopping, selling, basic, keyboard;
         private JMenu editMenu, playingModeMenu;
         public MyMenuBar(MyFrame myFrame)
              // is there any way I can pass a mnemonic to a method in order to cut a few lines here too?     
              JMenu fileMenu = new JMenu("File");
              fileMenu.setMnemonic(KeyEvent.VK_F);
              this.add(fileMenu);
              editMenu = new JMenu("Edit");
              editMenu.setMnemonic(KeyEvent.VK_E);
              this.add(editMenu);        
              JMenu helpMenu = new JMenu("Help");
              helpMenu.setMnemonic(KeyEvent.VK_H);
              this.add(helpMenu);
              //First Menu
              // can I pass accelerators as well? How?
              this.addJMenuItem(newGameItem, "Start new game", true, fileMenu);
                    //  below is where the exception is launched
              newGameItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));     
              this.addJMenuItem(stopGameItem, "Stop game", false, fileMenu);
              stopGameItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK));          
              //Second Menu
              playingModeMenu = new JMenu("Playing mode");
              ButtonGroup playingModeGroup = new ButtonGroup();
              this.addRadioButton(shopping, "shopping", true, playingModeGroup, playingModeMenu);
              this.addRadioButton(selling,"selling", false, playingModeGroup, playingModeMenu);
              editMenu.add(playingModeMenu);
              JMenu interactionModeMenu = new JMenu("Interaction mode");
              ButtonGroup interactionModeGroup = new ButtonGroup();
              this.addRadioButton(basic,"Basic", true, interactionModeGroup, interactionModeMenu);
              this.addRadioButton(keyboard,"Keyboard", false, interactionModeGroup, interactionModeMenu);
              editMenu.add(interactionModeMenu);                         
         private void addRadioButton(JRadioButton radioButton, String text, boolean isSelected, ButtonGroup group, JMenu menu)
              radioButton = new JRadioButton(text);
              if (isSelected)
                   radioButton.setSelected(true);
              group.add(radioButton);
              radioButton.addActionListener(this);
              menu.add(radioButton);
         private void addJMenuItem(JMenuItem item, String text, boolean isEnabled, JMenu menu)
              System.out.println(text);
              item = new JMenuItem(text);
              item.setEnabled(isEnabled);
              item.addActionListener(this);
              menu.add(item);
              System.out.println(text);
         public void actionPerformed(ActionEvent e1)
    }Thanks!

    These declarations have not been instantiated and so are all null:
        private JMenuItem exitItem, newGameItem, stopGameItem;
        private JRadioButton shopping, selling, basic, keyboard;When you send the reference to a method it shows up as null. Trying to reference
    a variable whose value is null generates the exception. Either instantiate the
    reference before sending it or try one of the two other approaches shown below.
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.util.ArrayList;
    import javax.swing.*;
    public class MyMenuBarRx extends JMenuBar implements ActionListener
        private JMenuItem exitItem, newGameItem, stopGameItem;
    //    private JRadioButton shopping, selling, basic, keyboard;
        private JMenu editMenu, playingModeMenu;
        public MyMenuBarRx()
            // is there any way I can pass a mnemonic to a method
            // in order to cut a few lines here too?     
            JMenu fileMenu = new JMenu("File");
            fileMenu.setMnemonic(KeyEvent.VK_F);
            this.add(fileMenu);
            editMenu = new JMenu("Edit");
            editMenu.setMnemonic(KeyEvent.VK_E);
            this.add(editMenu);        
            JMenu helpMenu = new JMenu("Help");
            helpMenu.setMnemonic(KeyEvent.VK_H);
            this.add(helpMenu);
            //First Menu
            // can I pass accelerators as well? How?
            newGameItem = addJMenuItem("Start new game", true, fileMenu);
            //  below is where the exception is launched
            newGameItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
                                            ActionEvent.CTRL_MASK));     
            stopGameItem = addJMenuItem("Stop game", false, fileMenu);
            stopGameItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
                                            ActionEvent.CTRL_MASK));          
            //Second Menu
            playingModeMenu = new JMenu("Playing mode");
            ButtonGroup playingModeGroup = new ButtonGroup();
            this.addRadioButton("shopping", true, playingModeGroup,
                                 playingModeMenu);
            this.addRadioButton("selling", false, playingModeGroup,
                                playingModeMenu);
            editMenu.add(playingModeMenu);
            JMenu interactionModeMenu = new JMenu("Interaction mode");
            ButtonGroup interactionModeGroup = new ButtonGroup();
            this.addRadioButton("Basic", true, interactionModeGroup,
                                 interactionModeMenu);
            this.addRadioButton("Keyboard", false, interactionModeGroup,
                                 interactionModeMenu);
            editMenu.add(interactionModeMenu);                         
        private void addRadioButton(String text, boolean isSelected,
                                    ButtonGroup group, JMenu menu)
            JRadioButton radioButton = new JRadioButton(text);
            if (isSelected)
                radioButton.setSelected(true);
            group.add(radioButton);
            radioButton.addActionListener(this);
            menu.add(radioButton);
        private JMenuItem addJMenuItem(String text, boolean isEnabled, JMenu menu)
            System.out.println(text);
            JMenuItem item = new JMenuItem(text);
            item.setEnabled(isEnabled);
            item.addActionListener(this);
            menu.add(item);
            System.out.println(text);
            return item;
        public void actionPerformed(ActionEvent e1)
        public static void main(String[] args)
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setJMenuBar(new MyMenuBarRx());
            f.setSize(200,200);
            f.setLocation(200,200);
            f.setVisible(true);
    }

  • Menu not showing in swing

    Hi,
    Can anyone help me get my menu showing in the GUI when the program is executed? It only shows the JTextPane, but no menu. Please help
    import javax.swing.*;
    import java.io.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.JOptionPane;
    public class TextEditor extends JFrame implements ActionListener
    private JMenuItem     open, save, print, exit;
    private JMenuItem timesNewRoman, tahoma, verdana, arial;
    private JMenuItem bold, italic, plain;
    private JMenuItem stats;
    public TextEditor()
              open = new JMenuItem ("Open");
              save = new JMenuItem ("Save");
              print = new JMenuItem ("Print");
              exit = new JMenuItem ("Exit");
              JMenu fileMenu = new JMenu ("File");
              JMenuBar menuBar = new JMenuBar();
              fileMenu.add(open);
              fileMenu.add(save);
              fileMenu.add(print);
              fileMenu.add(exit);
              menuBar.add(fileMenu);
              setJMenuBar(menuBar);
              JTextPane textPane = new JTextPane();          
         Container win = getContentPane();
              win.add(textPane);
              /*StyleConstants.setFontFamily(attr, "Serif");
              StyleConstants.setFontSize(attr, 18);
              StyleConstants.setBold(attr, true);*/
    public void menuItemSelected(JMenuItem mi)
    public static void main(String args [])
    TextPanel test = new TextPanel();
         test.setSize(500, 400);
         test.setTitle("Jonathan's Text Editor");
         test.setVisible(true);
    public void actionPerformed (ActionEvent e) {
    System.out.println (e.getActionCommand());
    /*public class TextEditor extends GBFrame
         private JMenuItem save, saveAs, open, exit, bold, italic, underline, wordCount, print;
         private JMenuItem timesNewRoman, verdana, arial, tahoma;
         private JTextArea typingArea;
         private JTabbedPane tab;
         public TextEditor()
              open = addMenuItem ("File", "Open");
              save = addMenuItem ("File", "Save");
              saveAs = addMenuItem("File", "Save As...");
              print = addMenuItem("File", "Print");
              exit = addMenuItem("File", "Exit");
              arial = addMenuItem("Font Type", "Arial");
              timesNewRoman = addMenuItem ("Font Type", "Times New Roman");
              tahoma = addMenuItem("Font Type", "Tahoma");
              verdana = addMenuItem("Font Type", "Verdana");
              bold = addMenuItem("Font Style", "Bold");
              italic = addMenuItem("Font Style", "Italic");
              underline = addMenuItem("Font Style", "Underline");
              wordCount = addMenuItem("File Statistics", "Generate");
              typingArea = addTextArea ("" ,1,1,5,5);
    /*String a = "Untitled";
    typingArea = new JTextArea("", 10, 10);
    typingArea.setEnabled(true);
    tab = new JTabbedPane();
    tab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    tab.add(a, new JScrollPane(typingArea));
         public void menuItemSelected (JMenuItem mi)
              if (mi == open)
              else if (mi == save)
              else if (mi == saveAs)
              else if (mi == print)
              else if (mi == exit)
                   System.exit(0);
              else if (mi == arial)
                   Font arial = new Font ("Arial", Font.PLAIN, 10);
                   typingArea.setFont(arial);
              else if (mi == timesNewRoman)
                   Font timesNewRoman = new Font ("Times New Roman", Font.PLAIN, 10);
                   typingArea.setFont(timesNewRoman);
              else if (mi == verdana)
                   Font verdana = new Font("Verdana", Font.PLAIN, 10);
                   typingArea.setFont(verdana);
              else if (mi == tahoma)
                   Font tahoma = new Font("Tahoma", Font.PLAIN, 10);
                   typingArea.setFont(tahoma);
         public static void main (String args [])
              TextEditor te = new TextEditor();
              te.setSize(800, 800);
              te.setVisible(true);
    }*/

    1) Post the code using [code ]...[code ] tags so the code is readable. Click on the "Formatting Help" link when you post a question.
    2) Most of the code in this post appears to be commented out. So why did you include it. It just confuses people.
    3) Based on the code you posted you are displaying a "TextPanel", not the TextEditor frame which contains the JMenuBar.
    So start by writing a simple program.
    a) create a frame
    b) once this works add a menu bar to your frame
    c) once this works add the text pane to your frame
    Test incremental changes rather than attempting to write the entire program at once and then do testing.

  • JMenu, passing mnemonic/ keyevent

    Hi
    Im building a JMenu but as it has many items im using a function to make each JMenuItem. The function calls the JMenu constructor with the text and the image to be used. I want to pass the mnemonic but can't work out how to do it.
    //example of function call
    menu1.add(add("myText","myPic.gif"));
    //what i need to send to function
    menuItem.setMnemonic(KeyEvent.VK_T);also is it possible to do the same with accelerators, ie pass this info to the function
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.ALT_MASK));thanks

    Okay, it's still not clear to me what you're trying it write, but is it a method like the following?
    import java.awt.event.*;
    import java.net.*;
    import javax.swing.*;
    public class Blank implements ActionListener {
        static JMenuItem add(JMenu menu, ActionListener al, String text, int mnemonic, String keyStoke, String iconURL) {
            JMenuItem item = new JMenuItem(text);
            if (al != null)
                item.addActionListener(al);
            if (mnemonic != 0)
                item.setMnemonic(mnemonic);
            if (keyStoke != null)
                item.setAccelerator(KeyStroke.getKeyStroke(keyStoke));
            try {
                if (iconURL != null)
                    item.setIcon(new ImageIcon(new URL(iconURL)));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            return menu.add(item);
        public void actionPerformed(ActionEvent evt) {
            System.out.println("your code here");
        public static void main(String[] args) {
            JMenuBar mb = new JMenuBar();
            JMenu menu = new JMenu("menu");
            add(menu, new Blank(), "blank", KeyEvent.VK_K, "control B", "http://forum.java.sun.com/im/ic_eye.gif");
            add(menu, null, "zip", 0, null, null);
            mb.add(menu);
            final JFrame f = new JFrame("Blank");
            f.setJMenuBar(mb);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
    }

  • Menu Causes Error In Paint

    The application is simple. Draw a circle where the mouse is located.
    Problem 1] If you click on the Menu (<File>) and then drag the mouse back into the window and move around the image becomes distorted.
    To reproduce the error(s). Simple copy the source code. Compile Target.java. Run Target.
    Target.java
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    import javax.swing.*;
    public class Target extends JFrame implements ActionListener
         private JMenuItem objItemExit;
         public Target()
              super("Target");
              objItemExit= new JMenuItem("Exit");
              objItemExit.addActionListener(this);
              JMenu objMenuFile = new JMenu("File");
              objMenuFile.add(objItemExit);
              JMenuBar objMenuBar = new JMenuBar();
              objMenuBar.add(objMenuFile);
              setJMenuBar(objMenuBar);
              getContentPane().add(new Grid());
              pack();
              setVisible(true);
              addWindowListener(new WindowAdapter() {
                   public void windowClosing(WindowEvent argEvent) {
                        Destructor();
         public void actionPerformed(ActionEvent argEvent)
              if (argEvent.getSource() == objItemExit) {
                   Destructor();
         public void Destructor()
              dispose();
              System.exit(0);
         public static void main(String [] argCommand)
              Target objTarget = new Target();
    }Grid.java
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class Grid extends JPanel implements MouseListener, MouseMotionListener
         private int iX;
         private int iY;
         public Grid()
              setPreferredSize(new Dimension(500, 500));
              iX = 0;
              iY = 0;
              addMouseListener(this);
              addMouseMotionListener(this);
         public synchronized int getX()
              return iX;
         public synchronized void setX(int argX)
              iX = argX;
         public synchronized int getY()
              return iY;
         public synchronized void setY(int argY)
              iY = argY;
         public void paint(Graphics argGraphic)
              Graphics2D objGraphic = (Graphics2D)argGraphic;
              int iWidth = getWidth();
              int iHeight = getHeight();
              int iTempX = getX();
              int iTempY = getY();
              // ==========
              // CREATE BUFFER
              BufferedImage objBuffer = (BufferedImage)createImage(iWidth, iHeight);
              Graphics2D objBufferGraphic = objBuffer.createGraphics();
              // ==========
              // FILL BACKGROUND
              objBufferGraphic.setColor(Color.white);
              objBufferGraphic.fillRect(0, 0, iWidth, iHeight);
              // ==========
              // DRAW IMAGE
              objBufferGraphic.setColor(Color.black);
              objBufferGraphic.drawOval(iTempX, iTempY, 10, 10);
              // ==========
              // LOAD BUFFER
              objGraphic.drawImage(objBuffer, 0, 0, this);
         public void mouseClicked(MouseEvent argEvent)
              argEvent.consume();
         public void mouseEntered(MouseEvent argEvent)
              setX(argEvent.getX());
              setY(argEvent.getY());
              repaint();
              argEvent.consume();
         public void mouseExited(MouseEvent argEvent)
              setX(argEvent.getX());
              setY(argEvent.getY());
              repaint();
              argEvent.consume();
         public void mousePressed(MouseEvent argEvent)
              argEvent.consume();
         public void mouseReleased(MouseEvent argEvent)
              argEvent.consume();
         public void mouseDragged(MouseEvent argEvent)
              setX(argEvent.getX());
              setY(argEvent.getY());
              repaint();
              argEvent.consume();
         public void mouseMoved(MouseEvent argEvent)
              setX(argEvent.getX());
              setY(argEvent.getY());
              repaint();
              argEvent.consume();
    }If anyone knows why when you click on the menu and then move around in the window and get distortion it would also be greatly appreciated because I have to add other panels to this window and the distortion over runs them.
    Thanks
    DeltaCoder

    Nope, still not working adding super.paintComponent(argGraphic); to the Grid.java paintComponent(Graphics argGraphic) method.
    Any other ideas?
    (I believe this should be placed in the bug session and hopefully be fixed. I can't see where the code is wrong.)
    DeltaCoder

Maybe you are looking for