JTextField を拡張し、KeyListener を実装するカスタム クラスを作成しました。これが私のクラスの抜粋です:
public class ChatBox extends JTextField implements KeyListener {
private boolean hidden;
public ChatBox(int x, int y, boolean hidden, MapFrame parent)
{
setBounds(x,y,300,30);
setBackground(new Color(255,255,255,40));
parent.addKeyListener(this);
if(hidden == true)
{
setVisible(false);
}
else
{
setVisible(true);
}
}
次に、KeyListener のイベントを作成しました。
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
System.out.println("KEY EVENT DETECTED PRESSED");
}
@Override
public void keyReleased(KeyEvent key) {
System.out.println("KEY EVENT DETECTED ON CHAT BOX");
if(key.getKeyCode() == KeyEvent.VK_ENTER)
{
System.out.println("Showing message input...");
setVisible(true);
repaint();
}
if(key.getKeyCode() == KeyEvent.VK_ESCAPE)
{
System.out.println("Hiding message input...");
setVisible(false);
repaint();
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
今、私が目指しているのは、ユーザーがエンターを押すとチャットボックスが表示され、エスケープを押すと消えることです。
ユーザーが Enter キーを押すと、chatbox/JTextField が表示され、「KEY EVENT DETECTED IN CHAT BOX」が発生しますが、この時点を過ぎると、キーリスナーは動作を拒否します。「チャットボックスで検出された重要なイベント」の印刷も表示されません。
コントロールにはフォーカスがあります (requestFocusInWindow() で特にフォーカスを与えようとさえしました) が、キー リスナーが機能しないため、TextField がそれらを「オーバーライド」することと関係があると想定しています。入力?
KeyListeners に JTextField の特定のキーをリッスンさせるにはどうすればよいですか?
よろしく、ベン。