新手问题,帮忙看看这段代码 我看了搂主的代码。直观的讲,搂主在keyPressed事件中,并没有将线添加到主函数中的TempSketch对象的线条数组中,而是添加到了事件监听类自己内部的TempSkethc对象,当然就不会画出直线了解决:还是把你自己的代码删除吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为你把内部类改为外部类了这里面就将牵扯一个对象的引用传递问题我无法细说,改好的程序如下,修改的位置用注释标出自己体会一下为什么吧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;}最后其实并不建议这样的写法其实感觉监听器用内部类比较好这个程序只是让你了解这样的程序应该注意什么当时并不推荐这样的写法^_^ 函数中的TempSketch对象自己内部的TempSkethc对象能否稍微解释一下这两个的意思,十分感谢! 实在太感谢 danceflash(Wine) 大虾了 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;} 应该这样说:你的KeyAction变成外部类之后KeyAction中的ccc是一个新的TempPanel对象与TempFrame中用 "TempPanel panel=new TempPanel();" 创建 panel 对象的根本就不是同一个对象所以KeyAction中所有对ccc的操作根本无法显示在窗口中因为你操作的不是同一个东西^_^ 再次感谢 danceflash ps:刚才结贴忘记给分了这里可以送分吗,我一定给 请帮我看一下,下面的代码为什么会报错?谢谢了 看这段代码,为什么输入exit还不退出。 为何还会出现类找不到的问题 Enumeration的疑问,会的请帮忙 为什么java是个平台,平台是什么意思? 关于Pettern的问题 从VC转到java不知有什么障碍 Js中如何分别取得的一个小数 的整数部分与小数部分?! java在一张图片上画线并保存,保存新图是黑底的,怎么解决 求大神赐教,sql的权限问题怎么解决啊? 小小程序完蛋了 汉字转换unicode码的问题?
这里面就将牵扯一个对象的引用传递问题
我无法细说,改好的程序如下,修改的位置用注释标出
自己体会一下为什么吧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;
}
最后
其实并不建议这样的写法
其实感觉监听器用内部类比较好这个程序只是让你了解这样的程序应该注意什么
当时并不推荐这样的写法^_^
自己内部的TempSkethc对象能否稍微解释一下这两个的意思,十分感谢!
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;
}
KeyAction中的ccc是一个新的TempPanel对象与TempFrame中用 "TempPanel panel=new TempPanel();" 创建 panel 对象的根本就不是同一个对象所以KeyAction中所有对ccc的操作根本无法显示在窗口中
因为你操作的不是同一个东西^_^