java - 为什么 keylistener 在这里不起作用?

标签 java swing

我已经实现了按键监听器接口(interface)并实现了所有需要的方法,但是当我按下按键时没有任何反应,为什么?

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);
            }
        }

最佳答案

代替 addKeyListener(this) 编写 frame.addKeyListener(this)

编辑:有关更多信息,请阅读 here 。顺便说一句,我不认为在面板中创建 JFrame 是一个好的设计,但这取决于您。

关于java - 为什么 keylistener 在这里不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2612639/

相关文章:

java - 如何在Java中获取 "num/den"类型的输入?

java - float 的格式

java - Swing 物质外观下载

java - 两个组合框之间的共享数据

java - 无法编译的源代码错误?

java - 如何扩展Eclipse的重命名重构完成后触发另一个重构

java - 指定 varchar 的长度和默认值时出现 SQLException

java - OSGi + Weld : FrameworkUtil getBundleContext() returns null

java - 如何让按钮在我想要的时间显示?

java - Java中的多种2D图形绘制函数