关于聚焦的问题

22 篇文章 0 订阅
1 篇文章 0 订阅

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();
即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值