简体   繁体   English

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

[英]Selecting text in JTextArea does not show any selection color

I have this piece of code in which a JTextArea is added to a JFrame . 我有这段代码,其中将JTextArea添加到JFrame Whenever the user presses the key the content of the JTextArea should be selected. 每当用户按下键时,都应选择JTextArea的内容。

Here is the code 这是代码

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();
    }
}

However I observe that nothing is selected on pressing key, instead if I slightly change the method keyPressed to the following, it works. 但是我观察到按键并没有选择任何内容,相反,如果我将方法keyPressed稍微更改为以下内容,它将起作用。

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

I want to know reason for this behaviour. 我想知道这种行为的原因。 Is it a threading issue ? 这是线程问题吗?

JTextArea uses arrow keys for moving the caret. JTextArea使用箭头键移动插入符号。 You're probably interfering with it. 您可能正在干扰它。 That is why invokeLater() helps. 这就是为什么invokeLater()帮助。

Also, you have to make sure the component is focusable and has focus. 另外,您必须确保组件可聚焦并具有焦点。 Key listener is a lower level interface. 密钥侦听器是较低级别的界面。 As already mention above in the comments, it is better to use Key Bindings instead. 如上面的注释中所述,最好改用“键绑定”。 See How to Use Key Bindings for details and examples. 有关详细信息和示例,请参见如何使用键绑定

Here is an example based on the posted code that uses 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);
    }
}

Also note that if text area looses its focus it may not show the selection. 另请注意,如果文本区域失去焦点,则可能不会显示所选内容。 So you may need to add jTextArea.requestFocusInWindow() before altering selection. 因此,您可能需要在更改选择之前添加jTextArea.requestFocusInWindow() Also there selectAll() that you may use to select all the text. 还有selectAll() ,您可以用来选择所有文本。 See bug 4320295 : select and selectAll don't work on JTextArea for some details. 请参见错误4320295:select和selectAll在JTextArea上不起作用,以获取一些详细信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM