在java中获取具有Focus的Component

Azu*_*zuu 2 java swing

我有JFrame,它有多个面板.每个专家组都有一些基于此设计的组件.我想在获得焦点时更改组件的背景颜色(JTextField).我有很多TextFields,我不想为所有组件编写FocusListener.是否有任何解决方案以智能方式完成.

kle*_*tra 9

你应该按照@Robin的建议考虑你的设计.通过工厂创建和配置应用程序的所有组件有助于使其能够抵御需求更改,因为只需要更改一个位置而不是分散在整个代码中.

此外,每个组件的单个侦听器将控件保持在焦点引发的属性发生变化的位置附近,因此不需要在全局侦听器中进行状态处理.

也就是说,全局focusListener的技术(如:使用小心!)解决方案是使用KeyboardFocusManager注册propertyChangeListener.

一个快速的代码片段(具有非常粗糙的状态处理:-)

JComponent comp = new JPanel();
for (int i = 0; i < 10; i++) {
    comp.add(new JTextField(5));
}
PropertyChangeListener l = new PropertyChangeListener() {
    Component owner;
    Color background;
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (owner != null && evt.getOldValue() == owner) {
            owner.setBackground(background);
            owner = null;
        } 
        if (evt.getNewValue() != null) {
            owner = (Component) evt.getNewValue();
            background = owner.getBackground();
            owner.setBackground(Color.YELLOW);
        }
    }
};
KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("permanentFocusOwner", l);
Run Code Online (Sandbox Code Playgroud)


Rob*_*bin 6

我不想为所有组件编写FocusListener

所以你不想替换你的

JTextField textField = new JTextField();
Run Code Online (Sandbox Code Playgroud)

通过

JTextField textField = TextFieldFactory.createTextField();
Run Code Online (Sandbox Code Playgroud)

哪里TextFieldFactory#createTextField是实用方法,它创建JTextField具有所需功能的方法.需要详细说明吗?