こんにちは、tomokooです。
JDK1.2では、JFrameにJTextやJButtonを配置した場合、setNextFocusableComponentでフォーカスを制御してました。
SUNのJavadocによるとJDK1.4では、"推奨されていません。 JDK バージョン 1.4 以降は、FocusTraversalPolicy に置き換えられました。 "
とあります。
FocusTraversalPolicyを見たりしたのですが、いまいちどう使っていいかよくわかりません。
移行の具体的な例を教えてほしいのですが。。。
例が載ってるURLや本でもかまいません。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
4回目の書き込みです。
(^^;ちょっと長いんですが、サンプル作成してみました。
従来のように、Nextを設定して使うようなFocusTraversalPolicyです。
Shift+TABによる逆順遷移については未対応で、デフォルトの動作をします。
ソースは見やすいように、半角スペース2個で全角スペースにしてあるので、
コピーしたあとに置換してください。
import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;
public class FocusTest extends Frame{
public static void main(String args[]){
new FocusTest().show();
}
public FocusTest(){
Button btn1 = new Button("Button 1");
Button btn2 = new Button("Button 2");
Button btn3 = new Button("Button 3");
Button btn4 = new Button("Button 4");
Button btn5 = new Button("Button 5");
setSize(200, 200);
setLayout(new BorderLayout());
add(btn1, BorderLayout.NORTH);
add(btn2, BorderLayout.WEST);
add(btn3, BorderLayout.CENTER);
add(btn4, BorderLayout.EAST);
add(btn5, BorderLayout.SOUTH);
btn4.setEnabled(false);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//フォーカス遷移ポリシーの作成
FocusTestTraversalPolisy tp = new FocusTestTraversalPolisy();
//遷移順の設定
tp.setNextFocusableComponent(btn1, btn5); //Button1→Button5
tp.setNextFocusableComponent(btn5, btn2); //Button5→Button2
tp.setNextFocusableComponent(btn2, btn4); //Button2→Button4
tp.setNextFocusableComponent(btn4, btn3); //Button4→Button3
tp.setNextFocusableComponent(btn3, btn1); //Button3→Button1
//このFrameのフォーカス遷移ポリシーとして設定
setFocusTraversalPolicy(tp);
}
private class FocusTestTraversalPolisy extends ContainerOrderFocusTraversalPolicy
{
private Hashtable focusMap;
private FocusTestTraversalPolisy(){
focusMap = new Hashtable();
}
public void setNextFocusableComponent(Component src, Component dest){
focusMap.put(src, dest);
}
public Component getComponentAfter(Container focusCycleRoot, Component aComponent){
//Hashtableから次のコンポーネントを取得
Component next = (Component)focusMap.get(aComponent);
if(next == null){
//nullだったらデフォルトの動作
return super.getComponentAfter(focusCycleRoot, aComponent);
}
if(!accept(next)){
//遷移不可の場合は、さらにその次。(再帰)
return getComponentAfter(focusCycleRoot, next);
}
return next;
}
}
}
この回答への補足
sasadoraさん、4回もお付き合いいただきありがとうございました。
また問題発生したらここで質問しますので、そのときはよろしくお願いします!
まだtab1回で遷移してくれませんが、とりあえずここで締め切ります。
はー、sasadoraさんのメアドが知りたい・・・。
ありがとうございました♪
sasadoraさん、大助かりです!
ありがとうございますぅ(T_T)
ちゃんと順番どおり動きました。
しかしここでまた問題が。。。
tabを2回押さないと動かない。
なんでだ!?
JButtonやJComboBoxもカスタマイズしちゃってるからなんか影響出てるのかなー?
ちょっと調べてみます。
ありがとうございました!!
No.3
- 回答日時:
JDK1.4.0入れました。
(^^;ためし中です…。
>コンテナにaddした順にフォーカスを遷移させたいんです。でもaddした通りに動いてくれないんです(TT)
addした順というのは不適切でした。
コンテナ内部におけるインデックスの順です。
インデックスを指定してaddすると、addするのが後でも指定した位置にaddできます。
FlowLayoutの場合、インデックス順序と配置順序が一致すると思うんですが、
BorderLayoutの場合、addした順に遷移すると思います。
Layoutは何を使用していますか?
>そしてsasadoraさんが教えてくださった方法っていうのは、
>画面ごとにフォーカス遷移クラスを作るってことなのでしょうか?
それは設計次第だと思います。40画面すべてで共通のFocusTraversalPolicyを作ることも可能です。
問題はどうやってAfter,BeforeのComponentを判断するかであって、それを40画面すべてで共通的な判断ロジックで作れば1つのFocusTraversalPolicyで十分かと思います。
FocusTraversalPolicyを使用するのも一案ですが、tomokooさんの場合は、
Layoutを別のものに変えれば十分な気もします。
とりあえず今、試してみているので、
あとでサンプルを書き込みにきますね。
(私にとっても非常に勉強になります。)
No.2
- 回答日時:
ためしてもいないので恐縮なんですか…。
やりたいこととしては、デフォルトではなく独自のフォーカス遷移を定義したいんですよね?
方法としては、
1.FocusTraversalPolicyを継承したサブクラス作成する。
このサブクラスに独自のフォーカス遷移ロジックを定義すればいいんだと思います。
2.作成したクラスを、指定のコンテナにsetFocusTraversalPolicyで指定する
独自のフォーカス遷移ロジックがそのコンテナに対して適用されるんだと思います。
こう思ってます。
ただし、FocusTraversalPolicyを継承してゼロから作成するのは大変なので、標準のFocusTraversalPolicyサブクラスである、ContainerOrderFocusTraversalPolicyを継承して作ったほうがらくだと思います。
ContainerOrderFocusTraversalPolicyを継承して、getComponentAfterなどをオーバーライドしてやればいいんじゃないかと。(デフォルトの動作のままでよいときは、オーバーライドしないでおく。)
単純に、コンテナに追加した順序と異なる順序で遷移したい。などという簡単な場合は、コンテナに追加する順序をフォーカス遷移と同じ順序にしたほうが、いいような気もします。(addする順序を変える)
#1.4は使ってないんで試せないんですが、いい機会なので暇があったら
#私も試してみようかと思います。
sasadoraさん、二回もありがとうございます!
コンテナにaddした順にフォーカスを遷移させたいんです。でもaddした通りに動いてくれないんです(TT)
画面を左から右へフォーカスが動いちゃうんです。
なにかを設定しないとだめなのでしょうか?
そしてsasadoraさんが教えてくださった方法っていうのは、画面ごとにフォーカス遷移クラスを作るってことなのでしょうか?
画面は40ほどあるのでそれはとても大変な気が・・・。
もっともそれしかないならやるしかありませんが。
回答にあげてもらったクラスを覗きつつ、さらに色々試してみます。
ありがとうございました!
No.1
- 回答日時:
こんにちは、tomokooさん。
私も使ったことないので、よく分からないのですが…。
こんなページがありました。
参考になるんではないでしょうか?
参考URL:http://www-6.ibm.com/jp/developerworks/java/0203 …
sasadoraさん、お早いお返事、ありがとうございます!
実はこれ、見たんです。
で、"リスト1. 理論的なフォーカス管理の例"のとおりやったのに動かない。。。
なんでだー?
設定が悪いのか、記述が抜けてるのか、私の頭が悪いのか(←これは否定できない・・・)
使ったことないのにお返事いただいて、ホントありがとうございました。
ちょっと感動しました(T_T)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
Java-jspの画面入力値保持について
-
ServletからServletへの値渡し
-
アドレスバーに引数を表示させ...
-
ASP.NET 画面遷移前の状態を保...
-
【JSP】input typeで入力された...
-
非アクティブな画面を操作する...
-
C言語で今まで表示していた画面...
-
Strutsで画面遷移させない。
-
ボタンを押したあとに画像を表...
-
window.openについて
-
ポップアップでウィンドウを表...
-
C# ログイン画面からメイン画面...
-
Beautiful Soupのインストール...
-
VC++にて、コンソールを二画面表示
-
Excel VBA のdebug(F8キー) が...
-
[VB6]画像切り取り
-
Strutsの情報保持の仕方について
-
strutsで、JSP→アクションクラ...
-
[戻る]やhistory.backでの遷移...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
C言語で今まで表示していた画面...
-
ASP.NET 画面遷移前の状態を保...
-
遷移元を判定したい!
-
Strutsの情報保持の仕方について
-
C# ログイン画面からメイン画面...
-
画面を隠す・消す方法を教えて...
-
Java-jspの画面入力値保持について
-
Wi-Fiのパスワードが指定なしと...
-
Javaプログラミングの質問にな...
-
FormのsubmitでFormの内容がnull
-
登録後、呼び出し元ページに戻...
-
ServletからServletへの値渡し
-
アドレスバーに引数を表示させ...
-
セッション切れでのリクエスト...
-
javaのstrutsを使った画面遷移...
-
JAVAのセッション変数の上書き...
-
Javascriptのhistory.back()が...
-
strutsで、JSP→アクションクラ...
-
Sessionがnullになりません。
おすすめ情報