tags:

views:

166

answers:

1

i have implemented keylistener interface and implemented all the needed methods but when i press the key nothing happens here, why?

package swing;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.image.BufferedImage;

    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;



    class   Paper extends JPanel implements MouseListener,MouseMotionListener,ActionListener,KeyListener
        {
            static BufferedImage image;
            String shape;
            Color color=Color.black;
            Point start;
            Point end;
            Point mp;
            Button elipse=new Button("elipse");
            int x[]=new int[50];
            int y[]=new int[50];
            Button rectangle=new Button("rect");
            Button line=new Button("line");
            Button roundrect=new Button("roundrect");
            Button polygon=new Button("poly");
            Button text=new Button("text");
            ImageIcon erasericon=new ImageIcon("images/eraser.gif");
            JButton erase=new JButton(erasericon);
            JButton[] colourbutton=new JButton[9];
            String selected;
            Point label;
            String key;
            int ex,ey;//eraser
            //DatagramSocket dataSocket;
            JButton button = new JButton("test");
            JLayeredPane layerpane;
            Point p=new Point();
            int w,h;
            public Paper() 
            {        
                JFrame frame=new JFrame("Whiteboard");
             frame.setVisible(true);
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setSize(640, 480);
             frame.setBackground(Color.black);



             layerpane=frame.getLayeredPane();

             setWidth(539,444);
            setBounds(69,0,555,444);



            layerpane.add(this,new Integer(2));
            layerpane.add(this.addButtons(),new Integer(0));

                setLayout(null);
                setOpaque(false);


                addMouseListener(this);
                addMouseMotionListener(this);

                setFocusable(true);
                addKeyListener(this);

                System.out.println(isFocusable());
                setBorder(BorderFactory.createLineBorder(Color.black));         
            }
               public  void paintComponent(Graphics g) 
               {
                try
                {
                    super.paintComponent(g);
                    g.drawImage(image, 0, 0, this);
                    Graphics2D g2 = (Graphics2D)g;
                    if(color!=null)
                    g2.setPaint(color);
                    if(start!=null && end!=null)
                    {
                        if(selected==("elipse"))
                            g2.drawOval(start.x, start.y,(end.x-start.x),(end.y-start.y));
                        else if(selected==("rect"))
                            g2.drawRect(start.x, start.y, (end.x-start.x),(end.y-start.y));
                        else if(selected==("rrect"))
                            g2.drawRoundRect(start.x, start.y, (end.x-start.x),(end.y-start.y),11,11);
                        else if(selected==("line"))
                            g2.drawLine(start.x,start.y,end.x,end.y);
                        else if(selected==("poly"))
                            g2.drawPolygon(x,y,2);
                    }
                }
                    catch(Exception e)
                    {}
            }
            //Function to draw the shape on image
            public  void draw()
            {       
                Graphics2D g2 = image.createGraphics();
                g2.setPaint(color);
                if(start!=null && end!=null)
                {
                    if(selected=="line")
                            g2.drawLine(start.x, start.y, end.x, end.y);
                    else if(selected=="elipse")
                            g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
                    else if(selected=="rect")
                            g2.drawRect(start.x, start.y, (end.x-start.x),(end.y-start.y));
                    else if(selected==("rrect"))
                        g2.drawRoundRect(start.x, start.y, (end.x-start.x),(end.y-start.y),11,11);
                    else if(selected==("poly"))
                        g2.drawPolygon(x,y,2);

                }
                if(label!=null)
                {
                    JTextArea textarea=new JTextArea();

                    if(selected==("text"))
                    {
                        textarea.setBounds(label.x, label.y, 50, 50);
                        textarea.setMaximumSize(new Dimension(100,100));
                        textarea.setBackground(new Color(237,237,237));

                        add(textarea);

                        g2.drawString("key",label.x,label.y);
                    }
                }
                start=null;
                repaint();
                g2.dispose();
            } 
            public void text()
            {
                System.out.println(label);

            }
            //Function which provides the erase functionality
            public  void erase() 
            {
                Graphics2D pic=(Graphics2D) image.getGraphics();
                Color erasecolor=new Color(237,237,237);
                pic.setPaint(erasecolor);
                if(start!=null)
                pic.fillRect(start.x, start.y, 10, 10);
            }
            //To set the size of the image
            public void setWidth(int x,int y)
            {
                System.out.println("("+x+","+y+")");
                w=x;
                h=y;
                image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
             }
            //Function to add buttons into the panel, calling this function returns a panel  
            public JPanel addButtons()
            {
                JPanel buttonpanel=new JPanel();
                buttonpanel.setMaximumSize(new Dimension(70,70));
                JPanel shape=new JPanel();
                JPanel colourbox=new JPanel();


                shape.setLayout(new GridLayout(4,2));
                shape.setMaximumSize(new Dimension(70,140));

                colourbox.setLayout(new GridLayout(3,3));
                colourbox.setMaximumSize(new Dimension(70,70));

                buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.Y_AXIS));

                elipse.addActionListener(this);
                elipse.setToolTipText("Elipse");
                rectangle.addActionListener(this);
                rectangle.setToolTipText("Rectangle");
                line.addActionListener( this);
                line.setToolTipText("Line");
                erase.addActionListener(this);
                erase.setToolTipText("Eraser");
                roundrect.addActionListener(this);
                roundrect.setToolTipText("Round rect");
                polygon.addActionListener(this);
                polygon.setToolTipText("Polygon");
                text.addActionListener(this);
                text.setToolTipText("Text");
                shape.add(elipse);
                shape.add(rectangle);
                shape.add(line);
                shape.add(erase);
                shape.add(roundrect);
                shape.add(polygon);
                shape.add(text);
                buttonpanel.add(shape);

                for(int i=0;i<9;i++)
                {
                    colourbutton[i]=new JButton();
                    colourbox.add(colourbutton[i]);
                    if(i==0)
                        colourbutton[0].setBackground(Color.black);
                    else if(i==1)
                        colourbutton[1].setBackground(Color.white);
                    else if(i==2)
                        colourbutton[2].setBackground(Color.red);
                    else if(i==3)
                        colourbutton[3].setBackground(Color.orange);
                    else if(i==4)
                        colourbutton[4].setBackground(Color.blue);
                    else if(i==5)
                        colourbutton[5].setBackground(Color.green);
                    else if(i==6)
                        colourbutton[6].setBackground(Color.pink);
                    else if(i==7)
                        colourbutton[7].setBackground(Color.magenta);
                    else if(i==8)
                        colourbutton[8].setBackground(Color.cyan);
                    colourbutton[i].addActionListener(this);
                }
                buttonpanel.add(colourbox);
                buttonpanel.setBounds(0, 0, 70, 210);
                return buttonpanel;
            }

            public void mouseClicked(MouseEvent e) 
            {
                if(selected=="text")
                {
                    label=new Point();
                    label=e.getPoint();

                    draw();
                }
            }
            @Override
            public void mouseEntered(MouseEvent arg0) 
            {
            }
            public void mouseExited(MouseEvent arg0) {

            }
            public void mousePressed(MouseEvent e) 
            {
                    if(selected=="line"||selected=="erase"||selected=="text")
                    {
                        start=e.getPoint();

                    }
                    else if(selected=="elipse"||selected=="rect"||selected=="rrect")
                    {
                        mp = e.getPoint();

                    }
                    else if(selected=="poly")
                    {
                        x[0]=e.getX();
                        y[0]=e.getY();
                    }

            }
            public void mouseReleased(MouseEvent e) 
            {
                if(start!=null)
                {
                    if(selected=="line")
                    {
                        end=e.getPoint();           

                    }
                    else if(selected=="elipse"||selected=="rect"||selected=="rrect")
                    {
                        end.x = Math.max(mp.x,e.getX());
                        end.y = Math.max(mp.y,e.getY());

                    }
                    else if(selected=="poly")
                    {
                        x[1]=e.getX();
                        y[1]=e.getY();
                    }           
                    draw();
                }
            }
            public void mouseDragged(MouseEvent e) 
            {
                if(end==null)
                    end = new Point();

                if(start==null)
                        start = new Point();

                 if(selected=="line")
                 {
                    end=e.getPoint();

                 }
                else if(selected=="erase")
                {
                     start=e.getPoint();
                     erase();

                }
                else if(selected=="elipse"||selected=="rect"||selected=="rrect")
                {
                    start.x = Math.min(mp.x,e.getX());
                    start.y = Math.min(mp.y,e.getY());
                    end.x = Math.max(mp.x,e.getX());
                    end.y = Math.max(mp.y,e.getY());

                }
                else if(selected=="poly")
                {
                    x[1]=e.getX();
                    y[1]=e.getY();
                }

                repaint();
            }
            public void mouseMoved(MouseEvent arg0) {} 
            public void actionPerformed(ActionEvent e) 
            {
                if(e.getSource()==elipse)
                    selected="elipse";
                else if(e.getSource()==line)
                    selected="line";    
                else if(e.getSource()==rectangle)
                    selected="rect";
                else if(e.getSource()==erase)
                {
                    selected="erase";
                    System.out.println(selected);
                    erase();
                }
                else if(e.getSource()==roundrect)
                        selected="rrect";
                else if(e.getSource()==polygon)
                    selected="poly";
                else if(e.getSource()==text)
                    selected="text";


                if(e.getSource()==colourbutton[0])
                    color=Color.black;
                else if(e.getSource()==colourbutton[1])
                    color=Color.white;
                else if(e.getSource()==colourbutton[2])
                    color=Color.red;
                else if(e.getSource()==colourbutton[3])
                    color=Color.orange;
                else if(e.getSource()==colourbutton[4])
                    color=Color.blue;
                else if(e.getSource()==colourbutton[5])
                    color=Color.green;
                else if(e.getSource()==colourbutton[6])
                    color=Color.pink;
                else if(e.getSource()==colourbutton[7])
                    color=Color.magenta;
                else if(e.getSource()==colourbutton[8])
                    color=Color.cyan;

            }
            @Override
            public void keyPressed(KeyEvent e) 
            {
                System.out.println("pressed");
            }
            @Override
            public void keyReleased(KeyEvent e) 
            {
                System.out.println("key released");
            }
            @Override
            public void keyTyped(KeyEvent e) 
            {
                System.out.println("Typed");
            }
            public static void main(String[] a)
            {
                new Paper();
            }
        } 

        class Button extends JButton
        {
            String name;
            public Button(String name) 
            {
                this.name=name; 
            }
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                //g2.setStroke(new BasicStroke(1.2f));
                if (name == "line")     g.drawLine(5,5,30,30);   
                if (name == "elipse") g.drawOval(5,7,25,20);
                if (name== "rect") g.drawRect(5,5,25,23);
                if (name== "roundrect") g.drawRoundRect(5,5,25,23,10,10);
                int a[]=new int[]{20,9,20,23,20};
                int b[]=new int[]{9,23,25,20,9};
                if (name== "poly") g.drawPolyline(a, b, 5);
                if (name== "text") g.drawString("Text",5, 22);
            }
        }
+2  A: 

Instead of addKeyListener(this) write frame.addKeyListener(this)

Edit: For more information read here. And by the way, I don't think that creating a JFrame inside a Panel is a good design, but that's up to yours.

Petar Minchev
thank u petar..For mouse events addMouseListener(this) is working fine, then why we need to write frame.addKeyListener(this) and not addKeyListener(this) for key events?For JFrame inside a panel class==>This code is a part of my project. this panel(Paper) will be added to another class which extends JFrame.
swift
If you do "this.requestFocus()", "addKeyListener(this)" will also work.
Petar Minchev
thanks for making it clear:)
swift