Какой компонент ввода текста в последний раз был в фокусе? - PullRequest
4 голосов
/ 14 апреля 2011

Предположим, у меня есть приложение Java, в котором есть несколько компонентов, в которые можно вводить текст.Теперь предположим, что это приложение также имеет диалоговое окно, которое позволяет вставлять в эти компоненты один символ (например, диалоговое окно в Word, которое появляется при выборе «Вставить» в меню «Правка»).Вы хотите, чтобы он вставлял символ в любой текстовый компонент, который был последним в фокусе.

Но как вы узнаете, какой текстовый компонент в последний раз был в фокусе?

Я мог бы отслеживать это вручную, передавая каждому текстовому компоненту приложение, когда оно получает фокус, а затемприложение вставляет новый символ в любой компонент, который был в фокусе в последний раз.

Но это должно быть распространенной проблемой (рассмотрим кнопки «Вставить» на панелях инструментов - откуда он знает, куда вставить его?).Есть ли что-то уже встроенное в Swing, что позволяет вам получить указатель на последний текстовый компонент, который был в фокусе?Или мне нужно написать это самому?

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Есть ли что-то, что уже встроено в Swing и позволяет получить дескриптор последнего текстового компонента, на котором был фокус?

Вы создаете действие, расширяющее TextAction.Класс TextAction имеет метод, который позволяет вам получить последний текстовый компонент с фокусом.

Редактировать:

Вы можете создать свое собственное действие и делать все, что захотите.Действие может быть добавлено к любому 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. на вкладке или с помощью мыши нажмите на «Вырезать»"button

Не имеет значения, что текстовое поле в данный момент не имеет фокуса, когда вызывается действие.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 голос
/ 15 апреля 2011

Точно так же, как предложено @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);
    }
}

Всего наилучшего, Боро.

0 голосов
/ 15 апреля 2011

Вы можете зарегистрировать FocusListener для каждого текстового компонента.FocusEvent объект имеет ссылку на последний компонент, который имел фокус.

0 голосов
/ 15 апреля 2011

Я никогда не делал этого напрямую, но вы можете взглянуть на FocusEvents и подсистему фокусировки .

Надеюсь, в Подсистеме Фокуса есть что-то, что будет вызывать события, которые вы можете прослушивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...