我有这段代码,其中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();
}
});
}
我想知道这种行为的原因。这是一个线程问题吗?
答案 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。