Search code examples
javaswinglistenerpopupmenu

Popupmenu wont work in java?


i am constructing a word processor program as an assignment for my Java class in school and i am having a really hard time getting the popupmenu to work when i right click on my text area. I have already constructed the popup menu and have my textarea listening to my popuplistener and i have overridden the mouse pressed and mouse released functions with

class popupframe extends JFrame{
JMenuItem copy;
JMenuItem paste;
JTextArea textarea = new JTextArea();
JPopupMenu pop;
popupframe(){
Container cpane = getContentPane();
setSize(300 , 300);
setLocation(300, 300);
setTitle("Test");
JPopupMenu pop = new JPopupMenu();
copy = new JMenuItem("copy");
paste = new JMenuItem("paste");
textarea = new JTextArea("something goes here", 5, 5);
pop.add(copy);
pop.add(paste);
PopupListener popuplistener = new PopupListener();
textarea.addMouseListener(popuplistener);

}

class PopupListener extends MouseAdapter{
    public void MousePressed(MouseEvent e){
        popit(e);
    }
    public void MouseReleased(MouseEvent e){
        popit(e);
    }
    private void popit(MouseEvent e){
        if(e.isPopupTrigger()){
            pop.show(e.getComponent(), e.getX(), e.getY());
        }
    }
}
}

I cannot see why it is not working but perhaps i am missing something crucial, please help!! much appreciated


Solution

  • Add the @Override annotation to the methods you think your are overriding...

    class PopupListener extends MouseAdapter {
    
        @Override
        public void MousePressed(MouseEvent e) {
            System.out.println("Pressed");
            popit(e);
        }
    
        @Override
        public void MouseReleased(MouseEvent e) {
            System.out.println("Pressed");
            popit(e);
        }
    

    You will now find that this fails to compile, but why? Because Java is case sensitive, and by convention, method names start with a lower case character

    You'll find that something like...

    class PopupListener extends MouseAdapter {
    
        @Override
        public void mousePressed(MouseEvent e) {
            popit(e);
        }
    
        @Override
        public void mouseReleased(MouseEvent e) {
            popit(e);
        }
    
        @Override
        public void mouseClicked(MouseEvent e) {
            popit(e);
        }
    
        private void popit(MouseEvent e) {
            if (e.isPopupTrigger()) {
                pop.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    }
    

    will work better. But having said that, you'll generally find

    textarea.setComponentPopupMenu(pop);
    

    significantly easier and less error prone (and it won't cause a NullPointerException like your example code will.