Как я могу заставить JTextArea использовать его ключевые события? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть GUI окно с несколькими компонентами. Некоторые из них являются кнопками, к которым я добавил сочетания клавиш. Например, определенная кнопка может быть вызвана нажатием «а» в любом месте окна. Один из компонентов в JTextArea. Теперь, когда фокус находится в текстовой области, и пользователь вводит, например, «aha» в JTextArea, кнопка запускается дважды (в дополнение к тексту «aha», добавляемому в текстовую область). Как я могу отключить это? Я хочу, чтобы JTextArea использовало событие "a", чтобы оно также не вызывало кнопку.

Что я хочу: если "a" напечатано в любом месте окна , за исключением в JTextArea я хочу, чтобы моя кнопка сработала. Но я не хочу, чтобы кнопка запускалась, когда JTextArea находится в фокусе, а пользователь печатает в JTextArea.

Что я уже пробовал: я пытался добавить KeyListener в JTextArea, который перехватывает и потребляет любой ключ, который напечатан. Но это имело противоположный эффект: кнопка все еще срабатывает, но буква не добавляется в JTextArea.

Вот минимальный пример:

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

// Create a simple GUI window                                                   
public class Gui
{
    private static void createWindow()
    {
        // Create a frame.                                                      
        JFrame frame = new JFrame("Simple");

        // Add a                                                                

        // Add a text area.                                                     
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextArea textarea = new JTextArea();
        textarea.setPreferredSize(new Dimension(300, 100));
        frame.getContentPane().add(textarea, BorderLayout.CENTER);

        // Add a button.                                                        
        JButton button = new JButton();
        button.setText("Button");
        button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.get\
KeyStroke(KeyEvent.VK_A, 0), "key");
        Action action = new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Action!");
                    button.doClick();
                }

            };
        button.getActionMap().put("key", action);
        frame.getContentPane().add(button, BorderLayout.LINE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[])
    {
        System.out.println("Hello, World");
        createWindow();
    }
}

1 Ответ

1 голос
/ 22 апреля 2020

JTextArea прослушивает keyTyped события. Вы добавляете привязку для keyPressed.

Если вместо этого вы создадите привязку для события keyTyped, то текстовая область будет обрабатывать событие:

//button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "key");
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("typed a"), "key");
...