我看了搂主的代码。直观的讲,搂主在keyPressed事件中,并没有将线添加到主函数中的TempSketch对象的线条数组中,而是添加到了事件监听类自己内部的TempSkethc对象,当然就不会画出直线了解决:还是把你自己的代码删除吧

解决方案 »

  1.   

    因为你把内部类改为外部类了
    这里面就将牵扯一个对象的引用传递问题
    我无法细说,改好的程序如下,修改的位置用注释标出
    自己体会一下为什么吧import java.awt.*;
    import java.awt.geom.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;public class TempSketch
    {
      public static void main(String[] args)
      {
        TempFrame frame=new TempFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
      }
    }class TempFrame extends JFrame
    {
      public TempFrame()
      {
        setTitle("Temp Sketch");
        setSize(frmWidth,frmHeight);
        TempPanel panel=new TempPanel();
        Container contentPane=getContentPane();
        contentPane.add(panel);
      }
      private static int frmWidth=400;
      private static int frmHeight=110;
    }class TempPanel extends JPanel
    {
      public TempPanel()
      {
        setBackground(Color.black);
        last=new Point2D.Double(10,10);
        lines=new ArrayList();
    //  addKeyListener(new KeyAction());
        addKeyListener(new KeyAction( this ));
    //由于修改了KeyAction的构造函数(见后),因此,这里的构造需要修改
    //this指调用这个函数的对象,即:在"public TempFrame()"中定义的
    //TempPanel panel=new TempPanel();
      }  public boolean isFocusTraversable()
      {
        return true;
      }  public void addline(int dx,int dy)
      {
        Point2D end=new Point2D.Double(last.getX()+dx,last.getY()+dy);
        Line2D line=new Line2D.Double(last,end);
        lines.add(line);
        repaint();
        last=end;
      }  public void paintComponent(Graphics g)
      {
        super.paintComponent(g);
        g.setColor(Color.white);
        Graphics2D g2=(Graphics2D)g;
        for(int i=0; i<lines.size();i++)
        {
          g2.draw((Line2D)lines.get(i));
        }
      }  private ArrayList lines;
      private Point2D last;
    }class KeyAction implements KeyListener
      {
        private TempPanel ccc;
    //让KeyAction有一个成员变量ccc类型为TempPanel   public KeyAction( TempPanel ccc)
       {
    //定义了一个带参数构造函数,由参数ccc带来一个TempPanel对象的引用
    //将引用赋给KeyAction的成员变量(this.ccc)
    //这样this.ccc与参数CCC将指向同一个TempPanel的对象
       this.ccc = ccc;
       }
        public void keyPressed(KeyEvent event)
        {
    //      TempPanel ccc = new TempPanel();
          if(event.getKeyCode()==KeyEvent.VK_RIGHT)
          {
            ccc.addline(d,0);
          }
          else if(event.getKeyCode()==KeyEvent.VK_LEFT)
          {
            ccc.addline(-d,0);
          }
          else if(event.getKeyCode()==KeyEvent.VK_UP)
          {
            ccc.addline(0,-d);
          }
          else if(event.getKeyCode()==KeyEvent.VK_DOWN)
          {
            ccc.addline(0,d);
          }
        }
        public void keyReleased(KeyEvent event){}
        public void keyTyped(KeyEvent event){}
        private static final int d=10;
    }
    最后
    其实并不建议这样的写法
    其实感觉监听器用内部类比较好这个程序只是让你了解这样的程序应该注意什么
    当时并不推荐这样的写法^_^
      

  2.   

    函数中的TempSketch对象
    自己内部的TempSkethc对象能否稍微解释一下这两个的意思,十分感谢!
      

  3.   

    实在太感谢 danceflash(Wine) 大虾了
      

  4.   

    import java.awt.*;
    import java.awt.geom.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;public class TempSketch
    {
      public static void main(String[] args)
      {
        TempFrame frame=new TempFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
      }
    }class TempFrame extends JFrame
    {
      public TempFrame()
      {
        setTitle("Temp Sketch");
        setSize(frmWidth,frmHeight);
        TempPanel panel=new TempPanel();
        Container contentPane=getContentPane();
        contentPane.add(panel);
      }
      private static int frmWidth=400;
      private static int frmHeight=110;
    }class TempPanel extends JPanel implements KeyListener
    {
      public TempPanel()
      {
        setBackground(Color.blue);
        last=new Point2D.Double(10,10);
        lines=new ArrayList();
        this.addKeyListener(this);
        //addKeyListener(new KeyAction(),this);
      }
      public TempPanel(ArrayList lines)
      {
        this.lines = lines;
        setBackground(Color.blue);
        last=new Point2D.Double(10,10);
        lines=new ArrayList();
        addKeyListener(new KeyAction());      
      }
      public boolean isFocusTraversable()
      {
        return true;
      }  public void addline(int dx,int dy)
      {
        Point2D end=new Point2D.Double(last.getX()+dx,last.getY()+dy);
        Line2D line=new Line2D.Double(last,end);
        lines.add(line);
        repaint();
        last=end;
      }  public void paintComponent(Graphics g)
      {
        super.paintComponent(g);
        g.setColor(Color.white);
        Graphics2D g2=(Graphics2D)g;
        for(int i=0; i<lines.size();i++)
        {
          g2.draw((Line2D)lines.get(i));
        }
      }
        public void keyPressed(KeyEvent event)
        {
          if(event.getKeyCode()==KeyEvent.VK_RIGHT)
          {
            addline(d,0);
          }
          else if(event.getKeyCode()==KeyEvent.VK_LEFT)
          {
            addline(-d,0);
          }
          else if(event.getKeyCode()==KeyEvent.VK_UP)
          {
            addline(0,-d);
          }
          else if(event.getKeyCode()==KeyEvent.VK_DOWN)
          {
            addline(0,d);
          }
        }
        public void keyReleased(KeyEvent event){}
        public void keyTyped(KeyEvent event){}
        private static final int d=10;
        private ArrayList lines;
        private Point2D last;
    }
      

  5.   

    应该这样说:你的KeyAction变成外部类之后
    KeyAction中的ccc是一个新的TempPanel对象与TempFrame中用 "TempPanel panel=new TempPanel();" 创建 panel 对象的根本就不是同一个对象所以KeyAction中所有对ccc的操作根本无法显示在窗口中
    因为你操作的不是同一个东西^_^
      

  6.   

    再次感谢 danceflash ps:刚才结贴忘记给分了这里可以送分吗,我一定给