代码如下import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ScollBall extends JFrame { /**
 * @param args
 */
BallPanel canvas=new BallPanel();
JPanel p2= new JPanel();
JButton left = new JButton("left");
JButton right = new JButton("right");
JButton up = new JButton("up");
JButton down = new JButton("down");

public ScollBall()
{
ButtonListener listener = new ButtonListener();
left.addActionListener(listener);
right.addActionListener(listener);
up.addActionListener(listener);
down.addActionListener(listener);

p2.add(left);
p2.add(right);
p2.add(up);
p2.add(down);

this.add(canvas,BorderLayout.CENTER);
canvas.setFocusable(true);
this.add(p2,BorderLayout.SOUTH);



}
public static void main(String[] args) {
// TODO Auto-generated method stub
ScollBall frame= new ScollBall();
frame.setSize(500, 300);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
class ButtonListener implements ActionListener
{ public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==left)
{
canvas.TurnLeft();

}
else if(e.getSource()==right)
{
canvas.TurnRight();

}
else if(e.getSource()==up)
{
canvas.turnup();
}
else if(e.getSource()==down)
{
canvas.TurnDown();
}

}

}
static class BallPanel extends JPanel
{
static int x=200;
static int y=100;
public BallPanel()
{
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
switch(e.getKeyCode())
{
case KeyEvent.VK_UP:
turnup();
break;
case KeyEvent.VK_DOWN:
TurnDown();
break;
case KeyEvent.VK_LEFT:
TurnLeft();
break;
case KeyEvent.VK_RIGHT:
TurnRight();

}


}

});
}


public void TurnLeft()
{
x=x-5;
repaint();

}
public void TurnRight()
{
x=x+5;
repaint();
}
public void turnup()
{
y=y-5;
repaint();
}
public void TurnDown()
{
y=y+5;
repaint();
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawOval(x, y, 30, 30);




}
}
}

解决方案 »

  1.   

    改变思路,给jbutton绑定加速键。
      

  2.   

    总体的错误我先跟你说下:
    你点canvas的时候事件有在监听,但是点击button后。光标已经回不到canvas哪里了,所以事件监听会失败。具体的解决方案还想不出来。你自己先思考下把canvas改成其他的看可不可以成功。
      

  3.   

    说到点在上去了 .............大神!!膜拜您说的把canvas改成其他的什么呢?  谢谢了
      

  4.   

    啥也不说了,眼泪哗哗的
    贴代码:
    package a;
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class ScollBall extends JFrame { /**
     * @param args
     */
    BallPanel canvas=new BallPanel();
    JPanel p2= new JPanel();
    JButton left = new JButton("left");
    JButton right = new JButton("right");
    JButton up = new JButton("up");
    JButton down = new JButton("down");

    public ScollBall()
    {
    ButtonListener listener = new ButtonListener();
    left.addActionListener(listener);
    right.addActionListener(listener);
    up.addActionListener(listener);
    down.addActionListener(listener);

    p2.add(left);
    p2.add(right);
    p2.add(up);
    p2.add(down);

    this.add(canvas,BorderLayout.CENTER);
    canvas.setFocusable(true);
    this.add(p2,BorderLayout.SOUTH);



    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ScollBall frame= new ScollBall();
    frame.setSize(500, 300);
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
    class ButtonListener implements ActionListener
    { public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(e.getSource()==left)
    {
    canvas.TurnLeft();
    remove(p2);
    add(p2);

    }
    else if(e.getSource()==right)
    {
    canvas.TurnRight();
    remove(p2);
    add(p2);

    }
    else if(e.getSource()==up)
    {
    canvas.turnup();
    remove(p2);
    add(p2);
    }
    else if(e.getSource()==down)
    {
    canvas.TurnDown();
    remove(p2);
    add(p2);
    }

    }

    }
    static class BallPanel extends JPanel
    {
    static int x=200;
    static int y=100;
    public BallPanel()
    {
    addKeyListener(new KeyAdapter()
    {
    public void keyPressed(KeyEvent e)
    {
    switch(e.getKeyCode())
    {
    case KeyEvent.VK_UP:
    turnup();
    break;
    case KeyEvent.VK_DOWN:
    TurnDown();
    break;
    case KeyEvent.VK_LEFT:
    TurnLeft();
    break;
    case KeyEvent.VK_RIGHT:
    TurnRight();

    }


    }

    });
    }


    public void TurnLeft()
    {
    x=x-5;
    repaint();

    }
    public void TurnRight()
    {
    x=x+5;
    repaint();
    }
    public void turnup()
    {
    y=y-5;
    repaint();
    }
    public void TurnDown()
    {
    y=y+5;
    repaint();
    }
    protected void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    g.drawOval(x, y, 30, 30);




    }
    }
    }
    代码基本没改就在按钮监听那边多加了两行:
    if(e.getSource()==left)
    {
    canvas.TurnLeft();
    remove(p2);
    add(p2);

    }
      

  5.   

    焦点不在canvas上了,要不按钮事件最后给canvas还回去?另外可不可以把listener加在frame上
      

  6.   

    哥们 你学的真好啊  向你学习了 [/quot]能解释一下那两行代码吗?