在JTextArea中选择文本不会显示任何选择颜色

时间:2013-04-18 16:56:00

标签: java swing jtextarea keylistener

我有这段代码,其中JTextArea添加到JFrame。 每当用户按下键时JTextArea的内容 应该被选中。

这是代码

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

public class SelectionTest extends KeyAdapter
{
    final JTextArea jTextArea;
    public static void main(String[] args)
    {
        new SelectionTest();
    }

    SelectionTest()
    {
        JFrame jFrame=new JFrame();
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jTextArea = new JTextArea("Test 1-2-3");
        jTextArea.addKeyListener(this);
        jFrame.add(jTextArea);
        jFrame.pack();
        jFrame.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() != KeyEvent.VK_UP ) return;
        jTextArea.selectAll();
    }
}

但是我发现在按键时没有选择任何内容, 相反,如果我稍微将方法keyPressed更改为以下内容,则可以正常工作。

@Override
public void keyPressed(KeyEvent e)
{
    if( e.getKeyCode() != KeyEvent.VK_UP ) return;
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            jTextArea.selectAll();
        }
    });
}

我想知道这种行为的原因。这是一个线程问题吗?

1 个答案:

答案 0 :(得分:4)

JTextArea使用箭头键移动插入符号。你可能在干涉它。这就是invokeLater()有帮助的原因。

此外,您必须确保该组件具有焦点并具有焦点。密钥监听器是一个较低级别的接口。正如上面评论中已经提到的,最好使用Key Bindings。有关详细信息和示例,请参见如何Use Key Bindings

以下是基于使用键绑定的已发布代码的示例:

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;

public class SelectionTest extends KeyAdapter
{
    final JTextArea jTextArea;
    public static void main(String[] args)
    {
        new SelectionTest();
    }

    SelectionTest()
    {
        JFrame jFrame=new JFrame();
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jTextArea = new JTextArea("Test 1-2-3");

        Action someAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                jTextArea.selectAll();
            }
        };
        jTextArea.getInputMap().put(
                KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "someAction");
        jTextArea.getActionMap().put("someAction", someAction);

        jFrame.add(jTextArea);
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

另请注意,如果文本区域失去焦点,则可能无法显示选择。因此,您可能需要在更改选择之前添加jTextArea.requestFocusInWindow()。还有selectAll()可用于选择所有文本。有关详细信息,请参阅错误4320295 : select and selectAll don't work on JTextArea