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

时间:2011-04-14 19:37:10

标签: java swing text focus

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

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

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

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

4 个答案:

答案 0 :(得分: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();
    }
}

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

component.replaceSelection(...);

编辑2:

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

  1. 选择一些文字
  2. 使用鼠标单击复选框
  3. 标签或使用鼠标点击“剪切”按钮
  4. 调用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();
            }
        }
    }
    

答案 1 :(得分:1)

就像@lesmana建议的那样(+1)。 这里有一个示例,显示在focusLost上,焦点侦听器返回先前聚焦的组件。

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Focusing
{
    public static void main(String[] args)
    {
        JPanel p = new JPanel();
        JTextField tf1 = new JTextField(6);
        tf1.setName("tf1");
        p.add(tf1);
        JTextField tf2 = new JTextField(6);
        tf2.setName("tf2");
        p.add(tf2);
        FocusListener fl = new FocusListener()
        {
            @Override
            public void focusGained(FocusEvent e)
            {
                System.out.println("focusGained e.getSource().c=" + ((JComponent) e.getSource()).getName());
            }

            @Override
            public void focusLost(FocusEvent e)
            {
                System.out.println("focusLost e.getSource().c=" + ((JComponent) e.getSource()).getName());
            }
        };
        tf1.addFocusListener(fl);
        tf2.addFocusListener(fl);
        JPanel contentPane = new JPanel();
        contentPane.add(p);
        JFrame f = new JFrame();
        f.setContentPane(contentPane);
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

一切顺利,博罗。

答案 2 :(得分:0)

我从未直接这样做,但您可以查看FocusEvents和Focus Subsystem

希望Focus子系统中有一些内容可以触发您可以监听的事件。

答案 3 :(得分:0)

您可以为每个文本组件注册FocusListenerFocusEvent对象引用了具有焦点的最后一个组件。