2013-04-18 2 views
2

나는이 코드를 가지고 JTextAreaJFrame에 추가되었습니다. 사용자가 키를 누를 때마다 JTextArea 의 내용을 선택해야합니다. 나는 아무것도 내가 약간 다음에 방법 keyPressed을 변경하는 대신 경우, 키 ↑ 을 를 눌러에 선택되어 있지 않은 것을 관찰 그러나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(); 
    } 
} 

, 그것은 작동합니다.

@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()이 도움이됩니다.

또한 구성 요소에 포커스가 있고 포커스가 있는지 확인해야합니다. 키 수신기는 하위 인터페이스입니다. 위에서 이미 언급했듯이 대신 키 바인딩을 사용하는 것이 좋습니다. 자세한 내용과 예제는 방법 설명 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을 참조하십시오.

관련 문제