2013-04-18 172 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