本帖最后由 Mosesbaby 于 2009-06-14 00:36:38 编辑

解决方案 »

  1.   

    可能是内部类的问题
    内部类MyKeyAdapter为private
    而main在外部类里,可以访问
      

  2.   

    嗯~~谢谢楼上两位的回答~~
    问题补充:我的MyPaintFrame.java文件里面的布局如下
    public MyPaintFrame() {
    super("Simple Drawing Board");
    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    addKeyListener(new KeyInput());

    panel=new MyPaintPanel();
    showMenu();
    //showTools();//我将这句话注释掉,就一切正常了,键盘响应也有了。
    getContentPane().add(panel);
    }注释掉的showTools函数如下,相关的定义我就省略了  >_<  :
    public void showTools() {
    choice=new JToolBar("Please choose:");

    tool=new JLabel("Tools:");
    color=new JLabel("Colors:");
    size=new JLabel("Sizes:");

    tools=new JComboBox();
    colors=new JComboBox();
    sizes=new JComboBox();
    choice.setLayout(new FlowLayout());

    ClearScreen=new JButton("ClearScreen"); for(String to:myTools)    //myTools是一个String类型的数组
    tools.addItem(to); for(String co:myColors)   //myColors是一个String类型的数组
    colors.addItem(co); for(String si:mySizes)    //mySizes是一个String类型的数组
    sizes.addItem(si);

    choice.add(tool);
    choice.add(tools);
    choice.add(color);
    choice.add(colors);
    choice.add(size);
    choice.add(sizes);
    choice.add(ClearScreen);

    add(choice,BorderLayout.NORTH);

    tools.addItemListener(new ItemListener(){ @Override
    public void itemStateChanged(ItemEvent e) {
    String str=(String)e.getItem();

    if(str.equals("Text"))
    panel.setTool(1);
    else if(str.equals("Line"))
    panel.setTool(2);
    else if(str.equals("Circle"))
    panel.setTool(3);
    else if(str.equals("Rectangle"))
    panel.setTool(4);
    else if(str.equals("Move"))
    panel.setTool(5);
    else if(str.equals("ChangeColor"))
    panel.setTool(6);
    else if(str.equals("Clear"))
    panel.setTool(7);
    else if(str.equals("ChangeSize"))
    panel.setTool(8);

    }});


    colors.addItemListener(new ItemListener(){ @Override
    public void itemStateChanged(ItemEvent e) {
    String str=(String)e.getItem();

    if(str.equals("Red"))
    panel.setColor(Color.red);
    else if(str.equals("Black"))
    panel.setColor(Color.black);
    else if(str.equals("Blue"))
    panel.setColor(Color.blue);
    else if(str.equals("Green"))
    panel.setColor(Color.green);
    else if(str.equals("More"))
    {
    Color c=null;
    c=JColorChooser.showDialog(MyPaintFrame.this, "Choose the Color", c);
    panel.setColor(c);
    }

    }});


    sizes.addItemListener(new ItemListener(){ @Override
    public void itemStateChanged(ItemEvent e) {
    String str=(String)e.getItem();

    if(str.equals("1"))
    panel.setSize(1);
    else if(str.equals("3"))
    panel.setSize(3);
    else if(str.equals("5"))
    panel.setSize(5);
    else if(str.equals("7"))
    panel.setSize(7);
    else if(str.equals("9"))
    panel.setSize(9);
    else if(str.equals("More"))
    panel.setSize((Integer.valueOf(JOptionPane.showInputDialog(MyPaintFrame.this, "More Sizes:"))));
    }});

    ClearScreen.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    panel.clearScreen();
    }});

    }难道是因为其中又有ItemListener的原因~~~
    实在是不知道为什么~~求各位指点~~