2010-04-10 124 views
0

我已经实现了keylistener接口并实现了所有需要的方法,但是当我按下键时什么都没有发生,为什么?为什么keylistener不在这里工作?

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

而不是addKeyListener(this)frame.addKeyListener(this)

编辑:欲了解更多信息,请阅读here。顺便说一下,我不认为在Panel中创建JFrame是一个很好的设计,但这取决于你的设计。

+0

对于鼠标事件,addMouseListener(this)工作正常,那么为什么我们需要为关键事件编写frame.addKeyListener(this)而不是addKeyListener(this)? 对于面板类中的JFrame ==> 此代码是我的项目的一部分。此面板(纸张)将被添加到扩展JFrame的另一个类中。 – swift 2010-04-10 08:28:51

+1

如果你做“this.requestFocus()”,“addKeyListener(this)”也可以。 – 2010-04-10 08:44:20

+0

感谢您的支持:) – swift 2010-04-10 08:45:58