0

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 の特定のキーをリッスンさせるにはどうすればよいですか?

よろしく、ベン。

4

0 に答える 0