- PR -

Swing フォーカス取得・喪失の取得

1
投稿者投稿内容
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 を貼り付けて実験してみましたが、ちゃんとフォーカスイベントを取れているように見えます。



ご指摘のとおりでした。シグニチャが違っていたのですね。
初歩的なミスで大変恥ずかしいです。

かずくんさんもフォーカスのポストの
仕方のコードを示していただき、参考になりました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)