代码如下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);
}
}
}
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);
}
}
}
你点canvas的时候事件有在监听,但是点击button后。光标已经回不到canvas哪里了,所以事件监听会失败。具体的解决方案还想不出来。你自己先思考下把canvas改成其他的看可不可以成功。
贴代码:
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);
}