- Shane
- 大ベテラン
- 会議室デビュー日: 2003/06/06
- 投稿数: 132
- お住まい・勤務地: Vancouver, BC
|
投稿日時: 2003-08-13 22:02
Swing アプリケーションを作成しているのですが、
フォーカス処理についてどなたか教えてください。
JFrame に JComponent が 複数あります。
このうちのある一つがフォーカスを持っているときのみ
メニューを有効にするという処理を実装したいのですが
方法がわかりません。
つまり、やりたい処理は、
とあるコンポーネントがマウスクリックなどで
フォーカスを取得したとき、そして失ったときのイベント処理です。
FocusAdapter を使ってみましたが、
これはキーボードフォーカスが対象のようで
うまく動作しませんでした。
よろしくお願いします。
|
- お犬様
- ベテラン
- 会議室デビュー日: 2003/01/26
- 投稿数: 67
|
投稿日時: 2003-08-13 22:57
| 引用: |
| Shinさんの書き込み (2003-08-13 22:02) より:
つまり、やりたい処理は、とあるコンポーネントがマウスクリックなどでフォーカスを取得したとき、そして失ったときのイベント処理です。
|
Component#setFocusable(boolean focusable) などを使用してもフォーカスを取得できないでしょうか?
[ メッセージ編集済み 編集者: お犬様 編集日時 2003-08-13 23:12 ]
|
- Shane
- 大ベテラン
- 会議室デビュー日: 2003/06/06
- 投稿数: 132
- お住まい・勤務地: Vancouver, BC
|
投稿日時: 2003-08-14 19:57
setFocusable() してみましたがだめでした。
以下のようなコードを動かしていますが、
フォーカスを受け取っても失っても println() されていません。
どのようにやれば実装できるのでしょうか?
フォーカス処理ができないはずはないと思っているのですが。。。
jTable1.setFocusable(true);
jTable1.addFocusListener(new FocusAdapter() {
public void focusGained() {
System.out.println("focusGained");
menu1.setEnabled(true);
}
public void focusLost() {
System.out.println("focusLost");
menu1.setEnabled(false);
}
});
|
- かずくん
- ぬし
- 会議室デビュー日: 2003/01/08
- 投稿数: 759
- お住まい・勤務地: 太陽系第三惑星
|
投稿日時: 2003-08-14 20:35
フォーカスを取得させるコンポーネントが分かっているなら、
java.awt.event.FocusEventのインスタンスを作成し、
java.awt.EventQueue.postEvent()メソッドで作成したイベントを転送してあげれば、
コンポーネントに登録したFocusListenerの各々のメソッドを呼ばせることができるのでは。
|
- かずくん
- ぬし
- 会議室デビュー日: 2003/01/08
- 投稿数: 759
- お住まい・勤務地: 太陽系第三惑星
|
投稿日時: 2003-08-14 21:06
button 1とかかれたボタンを押すとbutton 2に、
button 2とかかれたボタンを押すとbutton 1に、
フォーカスをそれぞれ移すサンプルを書いてみました。
| コード: |
|
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Focustest {
private static JButton b1;
private static JButton b2;
public static void main(String[] inArgs) {
JFrame f = new JFrame("focus test");
Container c = f.getContentPane();
JPanel p = new JPanel(new GridLayout(1, 2));
c.add(p);
b1 = new JButton("button 1");
p.add(b1);
b1.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent inEvent) {
System.out.println("button 1 gained the focus");
}
public void focusLost(FocusEvent inEvent) {
System.out.println("button 1 lost the focus");
}
});
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent inEvent) {
FocusEvent aEvent = new FocusEvent(b2, FocusEvent.FOCUS_GAINED);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aEvent);
}
});
b2 = new JButton("button 2");
p.add(b2);
b2.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent inEvent) {
System.out.println("button 2 gained the focus");
}
public void focusLost(FocusEvent inEvent) {
System.out.println("button 2 lost the focus");
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent inEvent) {
FocusEvent aEvent = new FocusEvent(b1, FocusEvent.FOCUS_GAINED);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aEvent);
}
});
f.pack();
f.show();
}
}
|
|
- お犬様
- ベテラン
- 会議室デビュー日: 2003/01/26
- 投稿数: 67
|
投稿日時: 2003-08-14 22:46
| 引用: |
| Shinさんの書き込み (2003-08-14 19:57) より:
setFocusable() してみましたがだめでした。
| だめですね。ちゃんと調べずに適当な事を書いて申し訳ないです。
| 引用: |
| Shinさんの書き込み (2003-08-14 19:57) より:
jTable1.addFocusListener(new FocusAdapter() {
public void focusGained() {
System.out.println("focusGained");
menu1.setEnabled(true);
}
public void focusLost() {
System.out.println("focusLost");
menu1.setEnabled(false);
}
});
| [誤]public void focusGained()
[正]public void focusGained(FocusEvent e)
とりあえず、JFrame に JTable と JButton を貼り付けて実験してみましたが、ちゃんとフォーカスイベントを取れているように見えます。
|
- Shane
- 大ベテラン
- 会議室デビュー日: 2003/06/06
- 投稿数: 132
- お住まい・勤務地: Vancouver, BC
|
投稿日時: 2003-08-15 09:30
| 引用: |
|
[誤]public void focusGained()
[正]public void focusGained(FocusEvent e)
とりあえず、JFrame に JTable と JButton を貼り付けて実験してみましたが、ちゃんとフォーカスイベントを取れているように見えます。
|
ご指摘のとおりでした。シグニチャが違っていたのですね。
初歩的なミスで大変恥ずかしいです。
かずくんさんもフォーカスのポストの
仕方のコードを示していただき、参考になりました。
ありがとうございました。
|