什么文本输入组件最后有焦点?

Pau*_*ers 4 java swing text focus

假设我有一个Java应用程序,它有多个组件,您可以在其中输入文本.现在假设此应用程序还有一个对话框,允许您将单个字符(如从"编辑"菜单中选择"插入"时出现的Word中的对话框)插入到这些组件中.您希望它将字符插入最后具有焦点的文本组件中.

但是你怎么知道哪个文本组件最后有焦点?

我可以手动跟踪这个,通过让每个文本组件在获得焦点时向应用程序报告,然后让应用程序将新角色插入到最后具有焦点的任何组件中.

但这必须是一个常见问题(考虑工具栏中的粘贴按钮 - 它如何知道将其粘贴到哪里?).是否已经内置了Swing中的内容,可以让您获得具有焦点的最后一个文本组件的句柄?或者我自己需要写这个?

cam*_*ckr 5

是否已经内置了Swing中的内容,可以让您获得具有焦点的最后一个文本组件的句柄?

您创建一个扩展TextAction的Action.TextAction类有一个方法,允许您获取具有焦点的最后一个文本组件.

编辑:

您可以创建自己的Action并执行任何操作.然后可以将Action添加到任何JMenuItem或JButton.例如:

class SelectAll extends TextAction
{
    public SelectAll()
    {
        super("Select All");
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();
        component.selectAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想在文本字段的插入位置插入一个字符,那么您可能只是这样做

component.replaceSelection(...);
Run Code Online (Sandbox Code Playgroud)

编辑2:

我不明白这个答案的混淆是什么.这是一个简单的例子:

  1. 选择一些文字
  2. 使用鼠标单击复选框
  3. 选项卡或使用鼠标单击"剪切"按钮

调用Action时,文本字段当前没有焦点并不重要.TextAction跟踪具有焦点的最后一个文本组件.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextActionTest extends JFrame
{
    JTextField textField = new JTextField("Select Me");
    JTabbedPane tabbedPane;

    public TextActionTest()
    {
        add(textField, BorderLayout.NORTH);
        add(new JCheckBox("Click Me!"));
        add(new JButton(new CutAction()), BorderLayout.SOUTH);
    }

    public static void main(String[] args)
    {
        TextActionTest frame = new TextActionTest();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
     }

    class CutAction extends TextAction
    {
        public CutAction()
        {
            super("Click to Cut Text");
        }

        public void actionPerformed(ActionEvent e)
        {
            JTextComponent component = getFocusedComponent();
//          JTextComponent component = getTextComponent(e);
            component.cut();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)