質問するログイン新規登録

回答編集履歴

1

追記

2018/01/05 16:27

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -1,1 +1,29 @@
1
- 自分の理解ではフォーカスというのは外すものではなく移動するものだと思います。つまりもし画面上にfocusableなコンポーネントが一つしかないのであれば、そのコンポーネントは常にフォーカスを持つことになると思います。
1
+ 自分の理解ではフォーカスというのは外すものではなく移動するものだと思います。つまりもし画面上にfocusableなコンポーネントが一つしかないのであれば、そのコンポーネントは常にフォーカスを持つことになると思います。
2
+
3
+ ---
4
+ 追記:
5
+ ちょっと混乱してしまいましたが、requestFocusというAPI名からやはりTextField(awt)またはJTextField(swing)のことを言っておられるのだと思います。(本件についてはどちらも同様だと思いますので以降JTextFieldとして話します)
6
+
7
+ awt/swingのフォーカス制御の考え方は最初の回答の通りだと思います。TextFieldが画面上に一つだけしかないような構成でTextFieldからフォーカスを外すためには「キーボードイベントをハンドリングするような別のコンポーネントを用意し、そこへフォーカスを移動する」と考えるとよいでしょう。
8
+
9
+ 例えばJTextFieldの親のJPanelに対して「マウスクリックしたときにフォーカスをそのJPanelへ移動する」と期待通りの動作になると思います。
10
+
11
+ ```Java
12
+ JPanel panel = new JPanel();
13
+ JTextField text = new TextField("");
14
+
15
+ panel.add(text);
16
+
17
+ // panelでキーボードイベントをハンドリングする(こうしないとフォーカスが移動してくれない)
18
+ panel.addKeyListener(new KeyAdapter());
19
+ // (フォーカスをJTextFieldから外すだけの目的なら実際にキーイベントのハンドリング処理は
20
+ // 何もしなくてもよいので上記のように何もしないリスナーを登録しておく)
21
+
22
+ // マウスクリックなどの契機でpanelへフォーカスを移動するようにしておく
23
+ panel.addMouseListener(new MouseAdapter() {
24
+ @Override
25
+ public void mousePressed(MouseEvent e) {
26
+ panel.requestFocus();
27
+ }
28
+ });
29
+ ```