当前位置: 首页 > 知识库问答 >
问题:

如何将FocusListener实现到JTextArea?

韶弘壮
2023-03-14

我创建了一个扩展JTextArea的新类,并用FocusListener实现了这个类,但是focusLost方法中的代码没有被执行。原因是什么?

protected class JDynamicTextArea extends JTextArea implements FocusListener { 
    public JDynamicTextArea() { 
        super(); 
        addFocusListener(this); 
    } 
    public void focusGained(FocusEvent e) { } 
    public void focusLost(FocusEvent e) { 
        System.out.println("Focus lost"); 
    } 
}

共有1个答案

汪才英
2023-03-14

对我来说似乎很好。。。

单击第二个文本字段,您应该会看到焦点丢失事件火。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFocus {

    public static void main(String[] args) {
        new TestFocus();
    }

    public TestFocus() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            add(new JScrollPane(new JDynamicTextArea()));
            add(new JTextField(10));
        }

    }

    protected class JDynamicTextArea extends JTextArea implements FocusListener {

        public JDynamicTextArea() {
            super(10, 10);
            addFocusListener(this);
        }

        public void focusGained(FocusEvent e) {
            System.out.println("Focus gained");
        }

        public void focusLost(FocusEvent e) {
            System.out.println("Focus lost");
        }

    }

}

更新了关键焦点转移

要重新启用键盘转移焦点,您需要将以下内容添加到构造函数

Set<KeyStroke> strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("pressed TAB")));
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, strokes);
strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("shift pressed TAB")));
setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, strokes);
 类似资料:
  • 介绍 (Introduction) FocusListener接口用于接收键盘焦点事件。 处理焦点事件的类需要实现此接口。 类声明 以下是java.awt.event.FocusListener接口的声明: public interface FocusListener extends EventListener 接口方法 (Interface methods) SN 方法和描述 1 void f

  • 介绍 (Introduction) FocusListener接口用于接收键盘焦点事件。 处理焦点事件的类需要实现此接口。 Class 声明 (Class Declaration) 以下是java.awt.event.FocusListener接口的声明 - public interface FocusListener extends EventListener 接口方法 Sr.No. 方法和描

  • 我需要对我们现有的Web API实施SAML 2.0 sso身份验证。我对这个主题相当陌生,所以我不知道从哪里开始。我一直在玩开发ADFS服务器(ADFS 4-Windows服务器2016),并一直在遵循有关如何设置依赖信任派对的教程。我已经掌握了SAML如何工作的要点,但仍然不知道如何通过webapi中的代码实现这一点。我想知道如何开始实现SAML 2身份验证以连接到ADFS服务器,Web应用程

  • 问题内容: 我们已经建立了销售点系统,现在我们需要将其实施到 触摸屏上吗?我们是否需要依次更改任何代码以使其正常工作。 而且我们正在使用键盘输入值-假设数量- 当我关注 JTextField时,是否有Java方式弹出键盘(例如android)? 问题答案: 这是有关如何实现弹出式键盘的简单示例:

  • 问题内容: 如何添加到MySQL表的现有列? 问题答案: 我认为您想按照命令中的说明进行操作。可能是这样的: 在上面运行之前,请确保该列具有主索引。

  • 问题内容: 我在Java应用程序中有成百上千的应用程序,我想添加所有这些来 设置 文本的“ 水平对齐” ,并在每个这些文本字段上 添加FocusListener 。因此,我做了这种方法,效果很好。但是我只是想知道这种正确的方法还是其中存在错误,或者我违反某种OOP规则? 这是代码 并将此方法应用于我的文本字段 现在,当我运行代码时,它非常有用,只是想知道这是否正确,如果不正确,那么当您必须在数百个