2

我有这段代码,其中 aJTextArea添加到 aJFrame中。每当用户按下↑</kbd> key the content of the JTextArea should be selected.

这是代码

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

但是我观察到按下时没有选择任何内容↑</kbd> key, instead if I slightly change the method keyPressed to the following, it works.

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

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

4

1 回答 1

4

JTextArea使用箭头键移动插入符号。你可能在干扰它。这就是为什么有invokeLater()帮助。

此外,您必须确保组件可聚焦且具有焦点。键监听器是一个较低级别的接口。正如上面评论中已经提到的,最好使用键绑定。有关详细信息和示例,请参阅如何使用键绑定

这是一个基于使用键绑定的发布代码的示例:

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 和 selectAll 在 JTextArea 上不起作用以获取一些详细信息。

于 2013-04-18T17:23:36.907 回答