JAVA组件焦点的特性:获取组件时其顶层组件必须为可见的

JAVA组件焦点的特性:其组件的顶层祖先必须为可见的。

requestFocus,requestFocusInWindow等这些方法在获取组件焦点时都提到了:

请求此 Component 获取输入焦点,并且此 Component 的顶层祖先成为获得焦点的 Window。此 Component 对于所要许可的请求而言 必须是不可显示的、可聚焦的和可见的并且其所有祖先(除了顶层 Window 以外)必须是可见的。此方法会尽力完成该请求;但是在某些情况下可能无法完成。在此 Component 接收 FOCUS_GAINED 事件前,开发人员永远不能假定此 Component 是焦点所有者。如果由于此 Component 的顶层 Window 没有成为获得焦点的窗口而拒绝了此请求,则记住此请求,并在后来用户使窗口成为获得焦点的窗口时许可此请求。
参考源码:Component的源码
        Component window = this;
        while ( (window != null) && !(window instanceof Window)) {
            if (!window.isVisible()) {
                if (focusLog.isLoggable(PlatformLogger.FINEST)) {
                    focusLog.finest("component is recurively invisible");
                }
                return false;
            }
            window = window.parent;
        }

例子:
import java.awt.event.*;
import javax.swing.*;

public class two{
	public static void main(String args[]){
		final JFrame jf = new JFrame();
		 A a = new A();
		jf.setSize(400,500);
		jf.add(a);
		jf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode() == KeyEvent.VK_LEFT){
					System.out.println("you");
				}
			}
		});
		a.requestFocus();
		jf.setVisible(true);
		jf.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e){
				jf.requestFocus();
			}
		});
		//a.requestFoucus();
	}
}

class A extends JPanel{
	public A() {
		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode() == KeyEvent.VK_LEFT){
					System.out.println("左");
				}
			}
		});
	}
}
代码简单说明:在two类中有一个窗体jf,对键盘事件监听,按下“←”,控制台打印出“you”,同时在Main方法中new出一个JPanel对象a,在类A中的构造方法中添加了键盘事件监听,按下“←”,控制台打印出“左”。同时为了实验,窗体jf实现了点击鼠标就会获得焦点。
实验一:a对象调用requestFocus()方法获得焦点后,窗体 jf 才显示。此时按下←键后,显示“you”。
实验二:窗体jf 先显示 再让a对象调用requestFocus()方法获得焦点。此时按下←键后,显示“左”。此时点击窗体,再按下←键后,显示“you”。
疑问:在实验一的情况下,如果点击JPanel所在处是否能获得JPanel的焦点呢?
窗体初始化时,此时焦点的拥有者为jf,(注释掉jf的监听鼠标事件后),点击JPanel的位置,测试结果仍为“you”。所以说明点击鼠标不能获得焦点。
结论:组件获取焦点时,其顶层容器必须可见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值