package sdfg.drfg;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Exercise16_33 extends JFrame{
Timer t1=new Timer(20, new L1());
int x=200;int y=100;
int x1=200;int y1=100;
int a =60;int b=1;int c=0;
int x0=200;int y0=100;
int n1=0;int n2=0;
Xian x11=new Xian();
public Exercise16_33(){
JButton b1=new JButton("Start!");
JButton b2=new JButton("Stop!");
JButton b3=new JButton("Up!");
JButton b4=new JButton("Down!");
JPanel p1=new JPanel();
p1.add(b1);
p1.add(b2);
p1.add(b3);
p1.add(b4);
add(x11,BorderLayout.CENTER);
add(p1,BorderLayout.SOUTH);
b2.addActionListener(new St2());
b1.addActionListener(new St1());
b3.addActionListener(new Up1());
b4.addActionListener(new Down1());
//x11.setFocusable(true);
}
public static void main(String[] args) {
Exercise16_33 e1=new Exercise16_33();
e1.setSize(500, 400);
e1.setLocationRelativeTo(null);
e1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
e1.setTitle("一起摇摆,摇摆摇摆!");
e1.setVisible(true);
}
class St2 implements ActionListener{
public void actionPerformed(ActionEvent e){
t1.stop();
//x11.requestFocusInWindow();
}
}
class St1 implements ActionListener{
public void actionPerformed(ActionEvent e){
t1.start();
//x11.requestFocusInWindow();
}
}
class L1 implements ActionListener{
public void actionPerformed(ActionEvent e){
repaint();
//x11.requestFocusInWindow();
}
}
class Up1 implements ActionListener{
public void actionPerformed(ActionEvent e){
y0=y0-5;
n1+=5;
n2+=5;
x11.requestFocusInWindow();
}
}
class Down1 implements ActionListener{
public void actionPerformed(ActionEvent e){
y0=y0+5;
//n1+=5;
//n2+=5;
}
}
class Xian extends JPanel{
public Xian(){
//this.setFocusable(true);
t1.start();
//this.setFocusable(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
System.out.println("sadg");
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:y+=10;y0+=10;break;
case KeyEvent.VK_UP:y-=10;y0-=10;break;
case KeyEvent.VK_RIGHT:x+=10;break;
case KeyEvent.VK_LEFT:x-=10;break;
}
repaint();
}
});
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.fillOval(x, y, 10, 10);
g.drawLine(x+5, y+5, x+5+(int)((195-n1)*(Math.cos(Math.toRadians(a)))), y0+5+(int)((195-n1)*(Math.sin(Math.toRadians(a)))));
g.fillOval(x+5-10+(int)((195-n1)*(Math.cos(Math.toRadians(a)))), y0+5-10+(int)((195-n2)*(Math.sin(Math.toRadians(a)))), 20, 20);
//(int)(Math.cos(Math.toRadians(a)))
//+(int)(Math.sin(Math.toRadians(b)))
b++;
if(b%60==0)c++;
if(c%2==0)a++;
if(c%2!=0)a--;
}
}
}
以上代码,运行的时候,当我没按按钮的时候,是可以通过键盘来控制方向的,但是我按了任一按钮的时候,键盘就没有用了,我发现这应该是聚焦的问题,惊奇的发现,当我按了按钮之后,按钮的中间是有一个虚线的方框框住按钮的,这应该是此时此刻,焦点已经聚焦在按钮上,而不是聚焦在面板上,面板无法获得焦点的原因不是 JPanel 无法获得焦点和 setFocusable(true) 无关其实 JPanel 的 focusable 默认就是 true 的它真正无法获得焦点的原因是:它没有默认添加通过鼠标点击获得焦点的监听器就是说,默认的情况下,JPanel 是不会通过鼠标点击获得焦点的你如果希望通过鼠标点击获得焦点需要自己添加鼠标监听器。
所以要解决这个问题,加上
x11.requestFocusInWindow();
即可。