回答編集履歴
1
追記
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
|
+
```
|