你应该把这个SketchPanel用到例子里去看看执行效果,就更容易知道它的执行顺序,这个类的主要作用是允许操作者利用键盘上的上下左右键(或者J,K,L,H)和SHIFT键配合在面板上画图
你可以看看结果:
TestPanel.java的内容:import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;class SketchPanel extends JPanel
{
private Point2D start;
private ArrayList lines; private static final int SMALL_INCREMENT=1;
private static final int LARGE_INCREMENT=5; public SketchPanel()
{
start=new Point2D.Double(100,100);
lines=new ArrayList();
KeyHandler listener=new KeyHandler();
addKeyListener(listener);
} public boolean isFocusable()
{
return true;
} public void add(int dx,int dy)
{
Point2D end=new Point2D.Double(start.getX()+dx,start.getY()+dy); Line2D line=new Line2D.Double(start,end);
lines.add(line);
repaint(); start=end;
} public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g; for(int i=0;i<lines.size();i++)
g2.draw((Line2D)lines.get(i));
} private class KeyHandler implements KeyListener
{
public void keyPressed(KeyEvent event)
{
int keyCode=event.getKeyCode(); int d;
if(event.isShiftDown())
d=LARGE_INCREMENT;
else
d=SMALL_INCREMENT; if(keyCode==KeyEvent.VK_LEFT) add(-d,0);
else if(keyCode==KeyEvent.VK_RIGHT) add(d,0);
else if(keyCode==KeyEvent.VK_UP) add(0,-d);
else if(keyCode==KeyEvent.VK_DOWN) add(0,d);
} public void keyReleased(KeyEvent event){}; public void keyTyped(KeyEvent event)
{
char keyChar=event.getKeyChar(); int d;
if(Character.isUpperCase(keyChar))
{
d=LARGE_INCREMENT;
keyChar=Character.toLowerCase(keyChar);
}
else
d=SMALL_INCREMENT; if(keyChar=='h') add(-d,0);
else if(keyChar=='l') add(d,0);
else if(keyChar=='k') add(0,-d);
else if(keyChar=='j') add(0,d); }
}
}public class TestPanel extends JFrame
{
TestPanel()
{
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SketchPanel sp=new SketchPanel();
getContentPane().add(sp);
}
public static void main(String[] args)
{
TestPanel tp=new TestPanel();
tp.setSize(200,200);
tp.show();
}
}
对于isFocusable(),它是属于JPanel的超类JComponent的一个方法,它的作用是判断容器(对于此例来说就是JPanel)是否可以获得焦点,因为只有JPanel的对象获得了焦点才可以画点或线,所以
它必不可少,它由paintComponent()来调用,所以我们在例子里看不到它的显式调用
你可以看看结果:
TestPanel.java的内容:import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;class SketchPanel extends JPanel
{
private Point2D start;
private ArrayList lines; private static final int SMALL_INCREMENT=1;
private static final int LARGE_INCREMENT=5; public SketchPanel()
{
start=new Point2D.Double(100,100);
lines=new ArrayList();
KeyHandler listener=new KeyHandler();
addKeyListener(listener);
} public boolean isFocusable()
{
return true;
} public void add(int dx,int dy)
{
Point2D end=new Point2D.Double(start.getX()+dx,start.getY()+dy); Line2D line=new Line2D.Double(start,end);
lines.add(line);
repaint(); start=end;
} public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g; for(int i=0;i<lines.size();i++)
g2.draw((Line2D)lines.get(i));
} private class KeyHandler implements KeyListener
{
public void keyPressed(KeyEvent event)
{
int keyCode=event.getKeyCode(); int d;
if(event.isShiftDown())
d=LARGE_INCREMENT;
else
d=SMALL_INCREMENT; if(keyCode==KeyEvent.VK_LEFT) add(-d,0);
else if(keyCode==KeyEvent.VK_RIGHT) add(d,0);
else if(keyCode==KeyEvent.VK_UP) add(0,-d);
else if(keyCode==KeyEvent.VK_DOWN) add(0,d);
} public void keyReleased(KeyEvent event){}; public void keyTyped(KeyEvent event)
{
char keyChar=event.getKeyChar(); int d;
if(Character.isUpperCase(keyChar))
{
d=LARGE_INCREMENT;
keyChar=Character.toLowerCase(keyChar);
}
else
d=SMALL_INCREMENT; if(keyChar=='h') add(-d,0);
else if(keyChar=='l') add(d,0);
else if(keyChar=='k') add(0,-d);
else if(keyChar=='j') add(0,d); }
}
}public class TestPanel extends JFrame
{
TestPanel()
{
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SketchPanel sp=new SketchPanel();
getContentPane().add(sp);
}
public static void main(String[] args)
{
TestPanel tp=new TestPanel();
tp.setSize(200,200);
tp.show();
}
}
对于isFocusable(),它是属于JPanel的超类JComponent的一个方法,它的作用是判断容器(对于此例来说就是JPanel)是否可以获得焦点,因为只有JPanel的对象获得了焦点才可以画点或线,所以
它必不可少,它由paintComponent()来调用,所以我们在例子里看不到它的显式调用
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货