2013-04-18 130 views
2

我有这段代码,其中JTextArea被添加到JFrame。 每当用户按键时,应选择JTextArea 的内容。在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(); 
     } 
    }); 
} 

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

+2

改为使用KeyBindings – StanislavL

回答

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