Java JTextArea KeyListener

Posted

技术标签:

【中文标题】Java JTextArea KeyListener【英文标题】: 【发布时间】:2013-08-31 06:50:54 【问题描述】:

当我按下 ENTER 时,我的 JTextArea 开始一个新行,我只想对 doClick() 方法执行其他操作。 我该怎么做?

textarea.addKeyListener(new KeyListener()
    @Override
    public void keyPressed(KeyEvent e)
        if(e.getKeyCode() == KeyEvent.VK_ENTER)
        button.doClick();
        
    

    @Override
    public void keyTyped(KeyEvent e) 
    

    @Override
    public void keyReleased(KeyEvent e) 
    
);

【问题讨论】:

根本不要使用 keyListeners(想知道你的代码是如何工作的:你有 focusable 标签?多么奇怪和让用户感到困惑......) - 使用 keyBindings 【参考方案1】:

使用.consume():

使用此事件,使其不会在默认情况下处理 方式由起源它的来源。

public void keyPressed(KeyEvent e)
    if(e.getKeyCode() == KeyEvent.VK_ENTER)
    e.consume();
    button.doClick();
    

Documentation

【讨论】:

@PéterSzakács 太棒了!很高兴我能帮上忙。 不要使用 Key Listener。 Swing 旨在与键绑定一起使用。【参考方案2】:

您应该将KeyBindings 与任何有问题的JTextComponent 一起使用。从Swing 的角度来看,KeyListeners 的级别太低了。您正在使用与 AWT 相关的概念,Swing 使用 KeyBindings 以更高的效率执行相同的任务并提供所需的结果:-)

一个小程序供你参考:

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

public class KeyBindingExample 

    private static final String key = "ENTER";
    private KeyStroke keyStroke;

    private JButton button;
    private JTextArea textArea;

    private Action wrapper = new AbstractAction() 
        @Override
        public void actionPerformed(ActionEvent ae) 
            button.doClick();
        
    ;

    private void displayGUI() 
        JFrame frame = new JFrame("Key Binding Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel(new BorderLayout(5, 5));

        textArea = new JTextArea(10, 10);
        keyStroke = KeyStroke.getKeyStroke(key);
        Object actionKey = textArea.getInputMap(
                JComponent.WHEN_FOCUSED).get(keyStroke);
        textArea.getActionMap().put(actionKey, wrapper);

        button = new JButton("Click Me!");
        button.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent ae) 
                System.out.format("Button Clicked :-)%n");
            
        );     

        contentPane.add(textArea, BorderLayout.CENTER);
        contentPane.add(button, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    

    public static void main(String[] args) 
        Runnable r = new Runnable() 
            @Override
            public void run() 
                new KeyBindingExample().displayGUI();
            
        ;
        EventQueue.invokeLater(r);
    

【讨论】:

以上是关于Java JTextArea KeyListener的主要内容,如果未能解决你的问题,请参考以下文章

Java / Swing:JScrollPane中的JTextArea,如何防止自动滚动?

Java JTextArea 如何实现换行???

Java - 在 JTextArea 中将颜色设置为文本

Java JTextArea KeyListener

JTextArea 中的 Java Swing 更新字符串

自动调整大小和滚动的 Java JTextArea