如何执行?在Panel面板中

pxr08 2003-10-30 09:45:20
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);

}
}
}
这是java核心技术里得一道例题,我想知道在class SketchPanel中执行得顺序是怎么样得,我没看到什么调用isFocusable()方法呀,是不是自动加载得?
...全文
54 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinzey34 2003-11-03
  • 打赏
  • 举报
回复
你应该把这个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()来调用,所以我们在例子里看不到它的显式调用

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧